有序数列中查找和为某定值的两个数
输入一个已经按升序排序过的数组和一个数字k,在数组中查找两个数,使得它们的和正好是k。要求时间复杂度是O(n)。
如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
两种思路
①设置两个指针,begain指向数组的第一个元素,end指向最后一个元素,判断两个数的和,若小于k,则begain后移,反之end迁移,直到找到符合要求的两个数或两指针相遇
②取最后数组中最后一个数(最大数)max,new一个大小为max的数组b[],对于每个元素a[i],令b[ a[i] ]=1,其余元素为0。(类似哈希表)
然后遍历a[],若b[ sum – a[i] ]==1,则找到这样的一堆数。
满足时间复杂度为On的要求,但空间复杂度可能很大。。。。
思路一:
<pre name="code" class="cpp">#pragma once
#include<iostream>
using namespace std;
void match(int a[], int size,int sum)
{
bool found = false;
int begain = 0;
int end = size - 1;
while (begain < end&&!found)
{
if (a[begain] + a[end] == sum)
{
cout << a[begain] << " " << a[end] << endl;
found = true;
}
else
if (a[begain] + a[end] > sum)
end--;
else
begain++;
}
if (!found)
cout << "there is no such kind of match" << endl;
}
void main()
{
int a[6] = { 1, 2, 4, 7, 12, 15 };
int sum = 15;
match(a, 6, sum);
system("pause");
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
