题目描述 - 两数之和
给定一个整数数组 nums 和一个整数目标值 target,在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
思路分析
- 枚举求解:嵌套循环数组中每一个数
nums[i]、nums[j]。判断所有的nums[i] + nums[j]是否等于target。如果出现nums[i] + nums[j] == target,则说明数组中存在和为target的两个整数,将两个整数的下标i、j输出即可。时间复杂度为 O(n2)。
代码实现:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if(nums.length){
for(let i=0;i <nums.length; i++){
let num1 = nums[i]
for(let j=i+1;j <nums.length; j++){
let num2 = nums[j]
if(target - num1 === num2) return [i,j]
}
}
}
};
- 哈希表:第一次遍历数组, 存储键值对映射为
target-nums[i] :i的字典(对象)表。第二次遍历数组,对于每一个数nums[i],先查找字典表中是否存在target - nums[i],存在则输出target - nums[i]对应的下标和当前数组的下标i。 代码实现:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if(nums.length){
let obj = {}
for(let i=0;i <nums.length; i++){
let num1 = nums[i]
obj[target-num1] = i+"" // 为使 数组下标为0时,对象值为0 判断生效
}
for(let i=0;i <nums.length; i++){
let num2 = nums[i]
// 字典表中存在 且不是自己, 如数组 nums = [1,3,2,4]; target = 6
if(obj[num2] && i!==Number(obj[num2])) return [i, obj[num2]]
}
}
};