描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路一:暴力解法。可以先假设num是目标两个数之一,则另一个数就是target - num,在数组中遍历除了num之外的其他数,看是否与target - num 相等。可以提升效率的是,num从数组第i位开始遍历,第二层循环从i + 1开始循环。此法时间复杂度
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
var len = nums.length
for (let i = 0; i < len; i++) {
var temp = nums[i]
var ind1 = i
if (i !== len - 1) {
for (let j = i + 1; j < len; j++) {
if (nums[j] === target - temp) {
var ind2 = j
return [ind1, ind2]
}
}
}
}
return [ind1, ind2]
};
思路二:可以用一个temp数组存放原nums数组内的数的下标。以示例nums为例,nums[0] = 2,则temp[2] = 0。见代码。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
var temp = []
for(let i = 0; i < nums.length; i++){
var num = target - nums[i] //要寻找的目标数
if(temp[num] !== undefined){ //目标数曾经出现过
return [temp[num], i]
}else temp[nums[i]] = i //目标数没有出现过,就将当前数的下标存进temp里
}
return []
};
此法时间复杂度可以降到 ,但空间复杂度也提高了,新建的temp的大小取决于原nums数组里数的大小