1. 程式人生 > >一個數組中兩個數的和為N,找出這兩個數字的下標

一個數組中兩個數的和為N,找出這兩個數字的下標

完整 進行 代碼 ray 由於 比較 返回 put else

分析,兩個數字的和為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]);

一個數組中兩個數的和為N,找出這兩個數字的下標