35 167. Two Sum II - Input Array Is Sorted

62 阅读1分钟

167. Two Sum II - Input Array Is Sorted

利用Map

利用map可以很好的处理无序数组,简单直观

解题思路

  1. 利用Map结构存储已经遍历过的值
  2. 遍历过程中如果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
};

双指针

解题思路

  1. 关键是利用数组已经排序号的性质,设置 low hight两个指针
  2. 将两个指针的值相加,如果等于 target 直接返回 [low + 1, high + 1],如果大于说明需要移动 high--,小于说明需要移动 low++
  3. 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]
};

二分法

解题思路

  1. 二分关键就是确定 low high边界,
  2. 首先遍历值时,选取遍历的值作为第一个值,只要找出这个选取值的右边区域即 i + 1 => numbers.length - 1
  3. 边界确定好后,利用进行搜索目标值即可

代码

/**
 * @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]
};