167. 两数之和 II - 输入有序数组 | 刷题打卡

92 阅读2分钟

前言

中等的题目对于我来说犹如天堑,之前就挑战了一道中等和困难。

做了两三个小时,在这样下去,完不成任务了。接下来简单题,show time!!

题目描述

给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3] 

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2] 

解题思路

单刀直入:

使用双重循环。

折半查找:

用变量low和high

双指针法

用变量left和right

单刀直入AC代码

var twoSum = function(numbers, target) {    
    var len = numbers.length;    
    for(var i = 0;i < len - 1;i++) {        
        var value = target - numbers[i];        
        for(var j = i+1;j < len;j++) {            
            if(numbers[j] == value) {                
                return [i+1,j+1];            
            }        
        }    
    }
};

折半查找AC代码

var twoSum = function(numbers, target) {    
    var len = numbers.length;    
    for(var i = 0;i < len-1;i++) {        
        var left = i+1,right=len-1;        
        var reduce = target - numbers[i];        
        while(left <= right) {            
            var mid = left + Math.floor((right - left) / 2);           
            var now = numbers[mid];            
            if(now == reduce) {                
                return [i+1,mid+1];            
            }            
            if(now < reduce) {                
                left = mid + 1;            
            }else {                
                right = mid - 1;            
            }        
        }    
    }
};

双指针法AC代码

var twoSum = function(numbers, target) {    
    var left = 0,right = numbers.length-1;   
    while(left < right) {        
        var sum = numbers[left] + numbers[right];        
        if(sum == target) {            
            return [left+1,right+1];       
        }       
        if(sum < target) {            
            left++;        
        }else {            
            right--;        
        }   
    }
};

总结

难题有难题的攻克爽度,简单题有简单题的夯实基础。

无论是什么题,记住初心: 成长。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情