1. 两数之和
分析:获取相加数字后的两个目标数据
题目
const numbers = [2,7,11,15]
const target = 9
const twoSum = (numbers, target) => {
// ...
}
console.log(twoSum(numbers, target))
// [0, 1] 或 [1, 0]
// 出题者保证
// 1. numbers 中的数字不会重复
// 2. 只会存在一个有效答案
思路:
- 两根手指法
- hashMap 法
答案
hashMap 法 (空间换时间)
时间复杂度:n
思路:
- 声明对象 map
- 遍历数组,计算差值
- 不存在则存入 map
- 存在则返回
const numbers = [2,7,11,15]
const target = 9
// map法
const twoSum = (numbers, target) => {
const map = new Map()
for(let i=0;i<numbers.length;i++){
const number = numbers[i]
const result = target - number
if(map.has(result)){
const resultIndex = map.get(result)
return [resultIndex,i]
}else{
map.set(number, i)
}
}
}
console.log(twoSum(numbers, 9))
双 for
时间复杂度:n²
const numbers = [2,7,11,15]
const target = 9
// 双for
const twoSum = (numbers, target) => {
for(let i=0;i<numbers.length;i++){
const num1 = numbers[i]
for(let j=1;j<numbers.length;j++){
const num2 = numbers[j]
let result = target - num1
if(result === num2){
return [i,j]
}
}
}
}
console.log(twoSum(numbers, 9))
1. 两数之和
分析:获取相加数字后的两个目标数据
答案
对撞指针
function sum(arr,target){
let left = 0,right = arr.length-1
while(left<right){
if(arr[left]+arr[right]>target){
right--
}else if(arr[left]+arr[right]<target){
left++
}else if(arr[left]+arr[right]==target){
return [left,right]
}
}
}
let arr = [1,2,3,4,5]
let target = 5
console.log(sum(arr,target))