方法一:
如果数组是无序的,先排序,
然后用两个指针i、j分别指向数组的首尾两端,然后i++,j--,逐次判断a[i]+a[j]?=sum:
如果某一刻a[i]+a[j]>sum, i不动,j--,
如果某一刻a[i]+a[j]<sum, i++,j不动
这种算法的时间复杂度有序O(n)、无序O(n*logn),空间复杂度为O(1)
public static void qiuhe(int[] a,int sum){ //数组a是有序的
int i = 0;
int j = a.length-1;
while(i<j){
if(a[i]+a[j]==sum){
System.out.println(a[i]+"和"+a[j]);
break;
//System.out.println(a[i] + "和" + a[j]);
//i++;
//j--; //用注释部分取代前两行,表示输出和为定值的所有可能组合
}else if(a[i]+a[j]>sum){
j--;
}else{
i++;
}
}
}
方法二:
假定要满足的和为sum,对数组中的每个数a[i]都判断sum-a[i]是否在数组中。这样就转换成一个查找问题。
如何让快速的查找sum-a[i]是否在数组中呢?可以用哈希表。
时间复杂度O(N),空间复杂度O(N)。用空间换时间。