分析,两个数字的和为N。那么这两个数字是否是唯一的呢?输出的下标是否是第一对出现的呢?
1,我们假设这两个数字是唯一的
和是唯一的,那么其中一个数字越大,另一个数字就越小。想到大小关系,我们就想到了排序。那么首先排序:
int array[]={ 1, 2, 7, 9, 13, 57, 36, 26, 55, 11, 9, 6, 3, 89, 36, 75, 36, 76, 95, 98, 101, 320, 520, 85, 36, 62, 49, 96, 1 };
因为要返回原始下标,所以要进行记录
int array1[]=array.clone();//这种记录最完善,但是查询不方便 Map<Integer,Integer> hs=new HashMap<Integer,Integer>();//这种方法没有顺序性只能查到原始下标但不能确定顺序,查询方便 Arrays.sort(array); 平均时间复杂度o(nlogn)
然后最小的加上最大的,如果大于n,证明大的太大了,就尝试第二大的数字。如果小于n就证明小的太小了,就尝试第二小的数字。
代码如下:
while((addAns=array[i]+array[j]-N)!=0&&i<j){ if(addAns>0){ j--; }else{ i++; } } if(i==j){ System.out.println("没有结果"); return; }
这样array[i]和array[j]就是所求的两个数字。
再通过hs.get(array[i]) 和hs.get(array[j])就得到了这两个数字的原始下标输出即可。但由于缺乏顺序性,这两个下标可能不是第一个出现的。
通过遍历数组的方式可以找到第一组数字。
完整代码:
int array[]={ 1, 2, 7, 9, 13, 57, 36, 26, 55, 11, 9, 6, 3, 89, 36, 75, 36, 76, 95, 98, 101, 320, 520, 85, 36, 62, 49, 96, 1 }; int array1[]=array.clone(); Map<Integer,Integer> hs=new HashMap<Integer,Integer>(); for (int i = 0; i < array.length; i++) { hs.put(array[i], i); } Arrays.sort(array); for (int i = 0; i < array.length; i++) { System.out.print(array[i]+","); } System.out.println(); for (int i = 0; i < array.length; i++) { System.out.print(array1[i]+","); } System.out.println(); int N = 35,s1=-1,s2=-1,i=0,j=array.length-1; int addAns; //比较,如果addAns>0表示 时间复杂度o(n) while((addAns=array[i]+array[j]-N)!=0&&i<j){ if(addAns>0){ j--; }else{ i++; } } if(i==j){ System.out.println("没有结果"); return; } //找到其中一组下标 System.out.println("any one: "+hs.get(array[i]) + ":" + array[i] + "+" + hs.get(array[j]) + ":" + array[j]); //找到第一组下标 时间复杂度o(n) for(int k=0;k<array1.length-1;k++){ if(array1[k]==array[i]&&s1<0){ s1=k; } if(array1[k]==array[j]&&s2<0){ s2=k; } if(s1>=0&&s2>=0) { break; } } System.out.println("first one: "+s1 + ":" + array[i] + "+" + s2 + ":" + array[j]);