请给出一个运行时间为 O(N*lgN)的复杂度,使这能在给定的一个由n个整数构成的集合S和 另一个 整数 sum 时,判断出 S中是否存在 两个和等于 sum 的元素。
先进行合并排序,得到一排序的数组A,时间复杂度为 O(N*lgN) ,
然后,遍历数组中的元素,每次用二分查找 sum-A[i] (注意,二分查收时,查找的目标数组为 A[0,1,2....n-1 ] -A[i] ,除去所在值剩下的数组中查收)
附:二分查找的算法:
首先说说二分查找法。
二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。
采用非递归方式完成二分查找法。java代码如下所示。
-
-
-
-
- public static int binarySearch(Integer[]srcArray,int des){
-
- int low=0;
-
- int high=srcArray.length-1;
-
- while(low<=high){
-
- int middle=low+((high-low)>>1);
-
- if(des==srcArray[middle]){
- return middle;
-
- }else if(des<srcArray[middle]){
- high=middle-1;
-
- }else{
- low=middle+1;
- }
- }
- return-1;
- }
-
- }
采用递归方式完成二分查找算法。代码如下所示。
-
-
-
-
-
-
-
-
- int BinSearch(int Array[],int low,int high,int key)
- {
- if (low<=high)
- {
- int mid = (low+high)/2;
- if(key == Array[mid])
- return mid;
- else if(key<Array[mid])
-
- return BinSearch(Array,low,mid-1,key);
- else if(key>Array[mid])
- return BinSearch(Array,mid+1,high,key);
- }
- else
- return -1;
推广:运行时间的复杂度 为 O(N)