167. Two Sum II - Input Array Is Sorted
利用Map
利用map可以很好的处理无序数组,简单直观
解题思路
- 利用Map结构存储已经遍历过的值
- 遍历过程中如果Map中存在
target - num,因为题目要求 1-indexed array 即从1开始计数的数组,所以每个索引都加1
代码
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
const map = new Map()
let result
for(let i = 0; i < numbers.length;i++) {
const num = numbers[i]
const key = target - num
if(map.has(key)) {
result = [map.get(key) + 1, i + 1]
} else {
map.set(num, i)
}
}
return result
};
双指针
解题思路
- 关键是利用数组已经排序号的性质,设置 low hight两个指针
- 将两个指针的值相加,如果等于 target 直接返回
[low + 1, high + 1],如果大于说明需要移动high--,小于说明需要移动low++ - hight low缩小的过程中,因为解是唯一的,那么说明 low high不会相交,说明此法可行
代码
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
let low = 0
let high = numbers.length - 1
while(high > low) {
const sum = numbers[low] + numbers[high]
if(sum === target) {
return [low + 1, high + 1]
} else if(sum > target) {
high--
} else {
low++
}
}
return [-1,-1]
};
二分法
解题思路
- 二分关键就是确定 low high边界,
- 首先遍历值时,选取遍历的值作为第一个值,只要找出这个选取值的右边区域即
i + 1 => numbers.length - 1 - 边界确定好后,利用进行搜索目标值即可
代码
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
const n = numbers.length
for(let i = 0; i < n; i++) {
const val = target - numbers[i]
let low = i + 1
let high = n - 1
while(high >= low) {
const mid = Math.floor(low + (high - low) / 2)
const midVal = numbers[mid]
console.log(mid)
if(midVal === val) {
return [i + 1, mid + 1]
} else if(midVal > val) {
high = mid - 1
} else {
low = mid + 1
}
}
}
return [-1,-1]
};