給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我知道,對某個問題想出最佳解法固然難得,然而要將自己的想法解釋給他人聽懂則更為難得
思路:首先對於這個問題我們很容易想到一種暴力解法。
看第乙個數nums[0],然後在nums[1]到nums[nums.size()-1]中查詢target-nums[0],如果找到了則是答案。
然後看第二個數nums[1],由於nums[1]和nums[0]在上一輪已經判斷過,所以只需要判斷從nums[2]到nums[nums.size()-1]中查詢target-nums[1]。
依次類推
時間複雜度o(n2),空間複雜度o(1);
嘗試使用一種更為簡單的方法。
我們知道在無序陣列中查詢乙個數需要消耗o(n)的時間,但是在集合中只需要消耗o(1)的時間。
所以可以將陣列中所有的數放入乙個unordered_map中,然後對每乙個數x,在集合中查詢target-x。
時間複雜度o(n),空間複雜度o(n),空間換取時間。
優化上面的方法。
我們不需要把所有數放入集合後再進行查詢,因為當我們遍歷到某個數時,與它配對的數可能在它前面已經出現。
遍歷陣列,對於每乙個數x,在集合中查詢target-x,如果找到,則輸出結果,如果沒找到,則將這個數放入集合,繼續遍歷。
時間複雜度和空間複雜度任然為o(n),但是可以預見期望值比上一種方法減少了一半。
/*我知道,對某個問題想出最佳解法固然難得,然而要將自己的想法解釋給他人聽懂則更為難得
思路:首先對於這個問題我們很容易想到一種暴力解法。
看第乙個數nums[0],然後在nums[1]到nums[nums.size()-1]中查詢target-nums[0],如果找到了則是答案。
然後看第二個數nums[1],由於nums[1]和nums[0]在上一輪已經判斷過,所以只需要判斷從nums[2]到nums[nums.size()-1]中查詢target-nums[1]。
依次類推
時間複雜度o(n2),空間複雜度o(1);
嘗試使用一種更為簡單的方法。
我們知道在無序陣列中查詢乙個數需要消耗o(n)的時間,但是在集合中只需要消耗o(1)的時間。
所以可以將陣列中所有的數放入乙個unordered_map中,然後對每乙個數x,在集合中查詢target-x。
時間複雜度o(n),空間複雜度o(n),空間換取時間。
優化上面的方法。
我們不需要把所有數放入集合後再進行查詢,因為當我們遍歷到某個數時,與它配對的數可能在它前面已經出現。
遍歷陣列,對於每乙個數x,在集合中查詢target-x,如果找到,則輸出結果,如果沒找到,則將這個數放入集合,繼續遍歷。
時間複雜度和空間複雜度任然為o(n),但是可以預見期望值比上一種方法減少了一半。
*/class
solution
}return result;}}
;
LeetCode 1 兩數之和
給定乙個整數數列,找出其中和為特定值的那兩個數。你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 step 1 class solution object def tw...
leetcode 1 兩數之和
1.兩數之和 這道題和程式設計之法上面的題目有以下幾個不同 1 題目所給定的陣列是無序的,程式設計之法裡面是預設有序的 2 要求輸出原陣列的序號,如果用乙個結構體維護陣列下標,那麼需要o n 的空間,顯然不是最好的方法 3 題目中包含負數,之前想用數值直接表示陣列下標,陣列值為原來的真正陣列下標,但...
leetcode 1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 class solution for int i 0 ...