前言
中等的题目对于我来说犹如天堑,之前就挑战了一道中等和困难。
做了两三个小时,在这样下去,完不成任务了。接下来简单题,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 春招闯关活动」, 点击查看 活动详情