leetcode 1 :Two Sum
題目鏈接: https://leetcode-cn.com/problems/two-sum/
難度: 簡單
歸類 : 數組操作,hashmap
題目
給定一個整數數組 nums和一個目標值 target,請你在該數組中找出和爲目標值的那兩個整數,並返回他們的數組下標。你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法
主要使用c++和python等兩種語言進行了解答,以及經典題解和嘗試改進的最優/最簡潔解法。
個人解法
C++解法
//c++解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> hashmap;
vector<int> res(2,0);
for(int i = 0; i < nums.size(); i++){
if(hashmap.find(target - nums[i]) != hashmap.end()){
res[0] = hashmap[target - nums[i]];
res[1] = i;
return res;
}else{
hashmap[nums[i]] = i;
}
}
return res;
}
};
時間複雜度: O(N)
空間複雜度: O(N)
提交結果:
執行用時 :16 ms, 在所有 C++ 提交中擊敗了69.92%的用戶
內存消耗 :8 MB, 在所有 C++ 提交中擊敗了100.00%的用戶
python解法
#python解法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
res = [0] * 2
dict_hash = {}
for i in range(len(nums)):
if (target - nums[i]) in dict_hash:
res[0] = dict_hash.get(target - nums[i])
res[1] = i
return res
else:
dict_hash.update({nums[i]: i})
return res
時間複雜度: O(N)
空間複雜度: O(N)
提交結果:
執行用時 :64 ms, 在所有 Python3 提交中擊敗了60.83%的用戶
內存消耗 :15.1 MB, 在所有 Python3 提交中擊敗了5.48%的用戶
題解優解
此題有三種解法:
暴力法(O(N^2),O(1)),兩遍哈希表(O(N),O(N)),一遍哈希表(O(N),O(N))
附上一個簡潔的python版本。
#python解法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""這樣寫更直觀,遍歷列表同時查字典"""
dct = {}
for i, n in enumerate(nums):
if target - n in dct:
return [dct[target - n], i]
dct[n] = i
時間複雜度: O(N)
空間複雜度: O(N)
提交結果:
執行用時 :80 ms, 在所有 Python3 提交中擊敗了49.78%的用戶
內存消耗 :15.1 MB, 在所有 Python3 提交中擊敗了5.48%的用戶
嘗試改進的最優解法
本題較爲簡單,無更優解法