C++在已排序数组中查找和值确定的第一次出现的两个数(要求时间复杂度为o(n))

#include <iostream>
using namespace std;
//输入一个已经按升序排序过的数组和一个数字,
//在数组中查找两个数,使得它们的和正好是输入的那个数字。
//要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
//例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
void Grial(int a[],int x,int y)
{
	int j=x-1;
	int i=0;
	while(a[j]>y)
		{
			j--;
		}
	 while(i<j)
		{
			while((a[i]+a[j])>y)
				j--;
			if((a[i]+a[j])>y)
			{
				j--;
			}
			else if((a[i]+a[j])<y)
			{
				i++;
			}
			else
			{
				cout<<a[i]<<endl;
				cout<<a[j]<<endl;
				return;
			}
		}
}
//注意时间复杂度最多是o(n),从两边往中间找,我不知到有没有这个算法,或者有更好的算法,但是我遇到这个问题时我思考了一下
//解决这个问题了,我是很开心的,希望和大家一起加油.
int main()
{
	int a[]={1, 2 ,3 ,4 ,5 ,6 ,7 ,8 ,9,100,3000};
	Grial(a,11,3003);
	return 0;
}

时间: 2024-12-08 21:15:13

C++在已排序数组中查找和值确定的第一次出现的两个数(要求时间复杂度为o(n))的相关文章

【剑指Offer】面试题53 - I. 在排序数组中查找数字 I

题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制:0 <= 数组长度 <= 50000 本题同[LeetCode]34. 在排序数组中查找元素的第一个和最后一个位置 思路 代码 时间复杂度:O(logn) 空间复杂度:O(1) class Solution { public: int search

leetcode题解:Search for a Range (已排序数组范围查找)

题目: Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm's runtime complexity must be in the order of O(log n). If the target is not found in the array, return [-1, -1]. For example,Given [5,

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

34. 在排序数组中查找元素的第一个和最后一个位置 题目要求用O(logn),明显要用二分. 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = nums.length; int mid = (i + j) / 2; int p = -1; while (i < j) { if (nums[mid] == target) { p = mid; bre

在排序数组中查找元素

/* 34.在排序数组中查找元素的第一个和最后一个位置. 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<mat

【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是?O(log n) 级别. 如果数组中不存在目标值,返回?[-1, -1]. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 本题同[剑指Offer]面试题53 - I. 在排序数组

在相邻元素相差1的数组中查找某一特定元素第一次出现的位置

题目:数组中相邻的每两个数之间的差值是1或-1,给定一个数N,求如何找到第一个N的位置. 如:3,4,3,2,1,2,3,4,3,4,5,6,5   求第一个5所在的位置. #include <stdio.h> #include <stdlib.h> int main(void) { int a[] = {3,4,3,2,1,2,3,4,3,4,5,6,5}; int i, next, to_search; int len = sizeof(a); int count = 0, f

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in

剑指offer:在排序数组中查找数字

题目: 统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4. # -*- coding: utf-8 -*- # @Time : 2019-07-13 15:10 # @Author : Jayce Wong # @ProjectName : job # @FileName : getNumberOfK.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : ht

53-1-在排序数组中查找数字

题目:数字在排序数组中出现的次数.输入为一个排序数组和一个数字. def get_first_num(nums,k,start,end): if start>end: return -1 mid = (end+start)//2 if nums[mid]==k: if mid==0 or (mid>0 and nums[mid-1]!=k): return mid else: end = mid-1 elif nums[mid]>k: end = mid-1 else: start =