leetcode-0001 兩數之和
- 2020 年 4 月 17 日
- 筆記
- 【*****演算法*****】
題目地址://leetcode-cn.com/problems/two-sum/
1.暴力解法
直接雙重循環,枚舉出所有可能的解,時間複雜度為O(n^2),空間複雜度為O(1)
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
}
2.HashTable
- 第一次循環將數組nums中的每個數都放入map中
- 第二次循環判斷target – nums[i]是否在map中
時間複雜度O(n), 空間複雜度O(1)
var twoSum = function(nums, target) {
let map = new Map()
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i)
}
for (let i = 0; i < nums.length; i++) {
if (map.has(target - nums[i]) && i !== map.get(target - nums[i])) {
return [i, map.get(target - nums[i])]
}
}
throw new Error('沒有這樣兩個數')
}
3.HashTable優化版
一次循環,先檢查map中是否含有target - nums[i]
,如果找到了,那就是我們要的結果;如果沒有找到就將這個nums[i]存入map中,繼續進行下一次循環,此種解法由於只循環了一次,因此時間複雜度會優於解法2
時間複雜度O(n),空間複雜度O(n)
var twoSum = function(nums, target) {
let map = new Map();
for (let i = 0; i < nums.length; i++) {
if (map.has(target - nums[i]) && i !== map.get(target - nums[i])) {
return [i, map.get(target - nums[i])]
}
map.set(nums[i], i)
}
throw new Error('沒有這樣的兩個數')
};
更多leetcode題解和數據結構方面的知識,請關注我的github://github.com/GuoLizhi/