import java.util.ArrayList;

import java.util.HashMap;

public class Solution {

public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {

    ArrayList<Integer> arr = new ArrayList<>();
    int len = array.length;
    // 方法一 暴力解法 时间复杂度O(n*2) 空间复杂度O(1)
    for(int i=0;i<len-1&&array[i]<sum;++i){
        for(int j=i+1;j<len&&array[j]<sum;++j){
            if(array[i]+array[j]==sum){
                arr.add(array[i]);
                arr.add(array[j]);
                return arr;
            }
        }
    }
    
    // 方法二 利用数组升序的特点
    int l=0, r=len-1;
    while(r>0 && array[r]>=sum) r--;
    while(l<r){
        if(array[l]+array[r]<sum)
            l++;
        else if(array[l]+array[r]>sum)
            r--;
        else{
            arr.add(array[l]);
            arr.add(array[r]);
            return arr;
        }
    }
    
    //方法三 哈希
    HashMap<Integer,Integer> map = new HashMap<>();
    for(int i=0;i<len;++i){//提前把小于sum的元素存入哈希中
        if(array[i]>sum)
            break;
        map.put(array[i],1);
    }
    for(int i=0;i<len;++i){
        if(map.containsKey(sum-array[i])){//sum-a在哈希中存在,说明找到了
            arr.add(array[i]);
            arr.add(sum-array[i]);
            return arr;
        }
    }
    return arr;
}

}