给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那
两个
整数,并返回他们的数组下标。javascript
你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素。前端
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]) ]
}
}
}
复制代码
其实这里还能把循环优化成为一个,代码以下🌰:java
/** * @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老师的前端补习班」并在后台留言,能够进群跟大佬们一块儿学习。 git