1、两数之和
1、两数之和
js
;(function () {
/**
* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
* 你可以按任意顺序返回答案。
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// interface ArrayKeyAny {
// [key: string | number | symbol]: any
// }
type numberArray = number[][]
// ## 返回所有满足条件的
var twoSum = function (nums: number[], target: number): numberArray {
// res是二维数组,保存符合要求的数组下标值
let res: numberArray = []
nums.forEach((x, k) => {
for (let i = 1; i < nums.length; i++) {
// i > k:去掉重复相加的两个元素
target === x + nums[i] && i > k ? res.push([k, i]) : null
}
})
return res
}
console.log(twoSum([1, 2, 3, 4, 5, 8, 7], 6)) // [ [ 0, 4 ], [ 1, 3 ] ]
// ## 只返回第一个满足条件的两个元素
function twoSumOnlyOne(nums: number[], target: number): number[] {
// 方法一
// let res: number[] = [];
// nums.forEach((x, k) => {
// for (let i = 1; i < nums.length; i++) {
// // i > k:去掉重复相加的两个元素
// (target === x + nums[i] && i > k) ? res.push(k, i) : null;
// }
// })
// return res
// 方法二
// let res: number[] = [];
// for (let i = 0; i < nums.length; i++) {
// let index = nums.indexOf(target - nums[i]);
// if(index !== -1 && i !== index) {
// res.push(i, index)
// break;
// }
// }
// return res
// 方法三
let res: number[] = []
const set = new Set()
for (let i = 0; i < nums.length; i++) {
// diff:差值
let diff = target - nums[i]
if (set.has(diff)) {
res.push(nums.indexOf(diff), i)
break
}
set.add(nums[i])
}
return res
}
console.log(twoSumOnlyOne([1, 2, 3, 4, 5, 8, 7], 6)) // [ 1, 3 ]
console.log(twoSumOnlyOne([3, 2, 4, 2, 2, 3], 6)) // [ 1, 2 ]
})()