【Java】 劍指offer(57-1) 和爲s的兩個數字

 

本文參考自《劍指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)

Java代碼

//題目:輸入一個遞增排序的數組和一個數字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.利用兩個指針從兩端向中間掃描,要學會這種技巧。

  

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索