首页 > 试题广场 >

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数

[问答题]

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和是输入的那个数字,要求时间复杂度为O(n),如果有多对数字的和等于输入的数字,输出任意一对即可。

private static void findAns(int[] data, int sum) {
    int size = data.length;
    int begin = 0;
    int end = size-1;
    while (begin < size && end >=0 && begin < end) {
        int cu = data[begin] + data[end];
        if (cu > sum) {
            end --;
        } else if (cu < sum) {
            begin ++;
        } else {
            System.out.println(data[begin] + " " + data[end]);
            return;
        }
    }
    System.out.println("无匹配项");
}
发表于 2017-07-30 10:37:54 回复(0)
publicvoidfind(int[] a,inttarget){
    intsmall=0;
    intbig=a.length-1;
    while(small<big){
         if(a[small]+a[big]>target){
             big--;
          }
          if(a[small]+a[big]<target){
              small++;
          }
          if(a[small]+a[big]==target){
              System.out.println(a[small]+" "+a[big]);
                break;
          }
    }
}

因为是升序排列
两个标志位,最小值small,和最大值big.
如果最小值的位置加最大值的位置和大于目标值,说明big值太大了,所以--
如果最小值位置加最大值位置小于目标值,说明small值太小
所以++
直到找到或没找到

编辑于 2017-08-01 11:39:47 回复(0)
public int[] findSumToNum(int[] nums,int target){
    Map<Integer,Integer> map=new HashMap<>();
    for(int i=0;i<nums.length;i++){
        if(map.containsKey(target-nums[i])){
            return new int[]={map.get(target-nums[i],i)};                             
        }
        else map.put(nums[i],i);
    }
    return new int[]={};
}


发表于 2019-09-23 00:13:06 回复(0)
二分查找
发表于 2018-03-20 10:17:22 回复(0)
数组设为arr,目标数设为num 则,for(int i=0;i<arr.lenght;i++){ int a=num-arr[i]; if(a==arr[i]) System.out.println(arr[i]) }
发表于 2017-12-17 01:38:15 回复(0)
哈希表
发表于 2017-08-01 15:12:43 回复(1)
对一楼的稍加修改
 public class FindSUm {
    public static void main(String[] args){ int[] a={1,2,3,4,5,6};  int b = 9;  findSum(a,b);  } public static void findSum(int[] data,int sum){ int size = data.length;  int end = size-1;  int begin = 0;  while (begin<size && end>=0 && begin<end){ int cu =data[begin] + data[end];  if (cu<sum){
                begin++;  }else if(cu>sum){
                end--;  }else{
                System.out.println(data[begin]+" "+data[end]);  end--;  begin++;  }
        }

    }
}
发表于 2017-08-01 10:20:31 回复(0)
  1. #include <assert.h>  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. bool OutputProperlyValue(const int *pA, int nSize, int nKey)  
  6. {  
  7.     assert(NULL != pA || nSize > 0);  
  8.   
  9.     int i32First = 0, i32End = nSize - 1;  
  10.     for (; i32First < i32End; )  
  11.     {  
  12.         if (pA[i32End] >= nKey)  
  13.         {  
  14.             i32End--;  
  15.         }  
  16.         else if ((pA[i32End] + pA[i32First]) < nKey)  
  17.         {  
  18.             i32First++;  
  19.         }  
  20.         else if ((pA[i32End] + pA[i32First]) > nKey)  
  21.         {  
  22.             i32End--;  
  23.         }  
  24.         else  
  25.         {  
  26.             cout << "两个元素和为" << nKey << "的值的数组元素为:" << pA[i32First] << "和" << pA[i32End] << endl;  
  27.             break;  
  28.         }  
  29.     }  
  30.   
  31.     if (i32First >= i32End)  
  32.         return false;  
  33.     return true;  
  34. }  
  35.   
  36.   
  37. int _tmain(int argc, _TCHAR* argv[])  
  38. {  

  39.     int aryT[] = {1, 2, 4, 7, 11, 15};  
  40.     if (!OutputProperlyValue(aryT, (sizeof(aryT)/sizeof (int)), 14))  
  41.     {  
  42.         cout << "数组里没有合适的值" << endl;  
  43.     }  
  44.   
  45.     return 0;  

  46. }  

发表于 2017-07-29 08:34:53 回复(1)