题目
- 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
- 你可以按任意顺序返回答案。
解题
1、暴力破解
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
//暴力破解
for(let i = 0 ; i < nums.length ;i++){
for(let j = i+1 ; j<nums.length;j++){
if(nums[i]+nums[j] === target){
return [i,j]
}
}
}
};
2、数组简化
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
//用数组装起来,减少遍历次数
let temp = [];
for(let i = 0 ; i < nums.length ; i++){
let num = target - nums[i]
if(temp[num] !== undefined){
return [temp[num],i]
}
temp[nums[i]] = i
}
};
3、利用Map
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
//利用Map
// (1)m.has(key),判断key是否存在
// (2)m.get(key),取值,如果没有这个key就返回undefined
// (3)m.set(key, value),设值,返回m
let map = new Map()
for(let i = 0; i<nums.length; i++){
let num = target-nums[i]
if(map.has(num)){
return [map.get(num),i]
}
map.set(nums[i],i)
}
};
4、利用指针
(1)创建一个新数组arr,将nums数组复制一份到arr,并将arr进行升序排
(2)创建两个指针start和end指向arr的开始和未尾
(3)对arr[start]和arr[end]相加和target进行比较,大于则end-1,小于则start+1,直到相等
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let arr = new Array(...nums)
arr.sort((a,b)=>a-b)
let len = nums.length
let start = 0
let end = len -1
while(start<end){
if(arr[start] + arr[end] > target){
end -= 1
}else if(arr[start] + arr[end] < target){
start += 1
}else{
return [nums.indexOf(arr[start]),nums.lastIndexOf(arr[end])]
}
}
};