1. 問題描述:
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
2. 思路分析:
① 題目不難理解,在一開始的時候想到使用遞迴來求解,在遞迴的方法中使用兩個指標乙個是左邊的指標,乙個是右邊的指標,我們在計算的時候可以有兩種可能的操作,一種是左邊的指標移動一位,右邊的指標不動,另外一種是左邊的指標不動,右邊的指標向左移動一位所以對應著兩種平行的狀態,所以使用兩種方法進行遞迴即可,並且在遞迴的時候使用乙個二維陣列來記錄求解過的結果,當在遞迴的時候發現之前求解過了那麼就直接返回了,但是在提交的時候超出記憶體限制了,可能是資料量太大了,所以使用了另外一種方法來解決
② 由於使用遞迴超時了,所以使用了map來進行對映,在一開始的時候遍歷整個陣列,將陣列中對應的值與值對應的下表進行對映,並且值為deque型別可以避免題目種兩個陣列元素是一樣的情況,使用map進行陣列值與下標的對映主要是為了在之後排序之後還能夠找到排序之前數字對應的下標值,我們使用map進行對映之後,對陣列進行排序,在迴圈中使用左右指標來操作,假如太小了左指標往右移,太大了右指標往左移直到兩個元素相等,這樣就可以避免遞迴超時的問題了
③ 在官方的題解中它是結合了題目中最多出現兩個數字相同的情況,所以使用一次for迴圈遍歷結合雜湊表進行解決,在求解的時候使用了相減的情況來找到另外乙個數字的對映情況,從解決了重複數字的映問題以及查詢的效率問題,寫的**非常棒
3. **如下:
我自己寫的**:
class solution
arrays.sort(nums);
/*使用快慢指標來解決*/
int l = 0, r = nums.length - 1;
while (l < r)else if (nums[l] + nums[r] < target) ++l;
else --r;
}return null;
}}
class solution
/*使用乙個陣列來記錄中間的求解過程*/
private void recursion(int nums, int target, int l, int r)
/*存在兩個平行的狀態: l加r不變, l不變r減*/
recursion(nums, target, l + 1, r);
recursion(nums, target, l, r - 1);
rec[l][r] = -1;
}}
官方**:
class solution ;
}map.put(nums[i], i);
}throw new illegalargumentexception("no two sum solution");
}}
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...
1 兩數之和
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...