LeetCode 167. 兩數之和 II - 輸入有序陣列
阿新 • • 發佈:2020-07-20
題目連結
題目分析
非常簡單的一個題目,因為給定的是一個有序陣列,我們可以直接使用雙指標思想去尋找兩個目標元素。如果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; } }