1. 程式人生 > 實用技巧 >LeetCode 167. 兩數之和 II - 輸入有序陣列

LeetCode 167. 兩數之和 II - 輸入有序陣列

題目連結

167. 兩數之和 II - 輸入有序陣列

題目分析

非常簡單的一個題目,因為給定的是一個有序陣列,我們可以直接使用雙指標思想去尋找兩個目標元素。如果num[left] + num[right]==target 就儲存迴圈結果然後退出迴圈,否則就看大小移動left或者right指標。
其實這個題還可以做二分查詢 ,我們外層迴圈使用一個i去遍歷0~num.length-2這麼多的元素,然後我們在內層使用二分查詢,查詢target-num[i]是否在陣列i~num.length-1中,存在的話就儲存結果然後退出迴圈。
這個題其實是1. 兩數之和的變種,第一題的輸入資料是無序的,但是如果我們預處理輸入陣列後,也會變成這題的做法。對於第一題,我們最好的方法就是使用一個hashmap作為快取,只需要一個O(n)的時間複雜度就可以完成解題。

程式碼實現

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] res = new int[2];
        int left = 0;
        int right = numbers.length - 1;
        while(left < right){
            if(numbers[left] + numbers[right] == target){
                res[0] = left+1;
                res[1] = right+1;
                break;
            }else if(numbers[left] + numbers[right] > target){
                right--;
            }else if(numbers[left] + numbers[right] < target){
                left++;
            }
        }
        return res;
    }
}