本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們的和正好是s。若是有多對數字的和等於s,輸出任意一對便可。數組
從頭開始遍歷數字,肯定一個數字後,對後面的數字遍歷,判斷和是否爲s,這種方法複雜度爲O(n^2),效率過低。post
咱們考慮到,若是一個數字比較小,那麼另外一個數字必定比較大,同時數字爲遞增排列;因此,咱們設置兩個指針,一個指針small從第一個數字(最小)出發,另外一個指針big從最後一個數字(最大)出發:測試
當small加big的和小於s時,只須要將small指向後一個數字(更大),繼續判斷;url
當small加big的和大於s時,只須要將big指向前一個數字(更小),繼續判斷;指針
當small加big的和等於s時,求解完成。htm
因爲是從兩邊往中間移動,因此不會有跳過的狀況,時間複雜度爲O(n)。blog
測試算例 排序
1.功能測試(存在/不存在和爲s的一對數字)
2.特殊輸入測試(null)
//題目:輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們 //的和正好是s。若是有多對數字的和等於s,輸出任意一對便可。 public class TwoNumbersWithSum { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list = new ArrayList<Integer>(); if(array==null || array.length<=0) return list; int low=0; int high=array.length-1; while(low<high){ if(array[low]+array[high]==sum){ list.add(array[low]); list.add(array[high]); break; }else if(array[low]+array[high]<sum) low++; else high--; } return list; } }
1.利用兩個指針從兩端向中間掃描,要學會這種技巧。