題目描述📄
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個
整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
題目剖析🧐
一、 暴力搜索
- 雙層循環,嘗試每一個可能的和
- 找到
nums[i] + nums[j] === target
時返回[i, j]
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const len = nums.length
for (let i = 0; i < len - 1; i++) {
for (let j = i + 1; j < len; j++) {
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
}
- 時間複雜度:
O(n^2)
- 空間複雜度:
O(1)
思路二、空間換時間 —— 巧用哈希表
- 將
target - nums[i]
和i
的值存放在哈希表
中,target - nums[i]
對應i
- 遍歷一次
nums
數組,找到一個存在於哈希表
中的nums[i]
,即找到兩個數字之和等於target
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map()
for (let i = 0; i < nums.length; i++) {
map.set(target - nums[i], i)
}
for (let i = 0; i < nums.length; i++) {
const ans = map.get(nums[i])
if (ans && ans !== i) {
return [ i, map.get(nums[i]) ]
}
}
}
其實這裏還能把循環優化成爲一個,代碼如下🌰:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map()
for (let i = 0; i < nums.length; i++) {
const ans = target - nums[i]
if (map.has(ans)) {
return [ i, map.get(ans) ]
}
map.set(nums[i], i)
}
}
- 時間複雜度:
O(n)
- 空間複雜度:
O(n)
寫在最後
一直在 LeetCode 上刷題,之前還加入了組織,有興趣加入一起學習的同學可以在下方留言或者關注我的微信公衆號「tony老師的前端補習班」並在後臺留言,可以進羣跟大佬們一起學習。