输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
分析:刚开始采用直接暴力解法,从数组的0位开始,使用temp = target - nums[0];得到另外一个可能需要找的值的大小,然后循环遍历,这种方法,当数据少的时候可行,数据多了就超出时间限制了。
var twoSum = function(nums, target) {
var arr = [];
for(let i = 0; i < nums.length; i++){
var temp = target - nums[i];
for(let j = i+1; j < nums.length;j++){
var index1, index2;
if(temp == nums[j]){
index1 = i;
index2 = j;
break;
}
}
}
arr.push(nums[index1]);
arr.push(nums[index2]);
return arr;
};
最后想到了定义两个指针,left指向nums的第0位,right指向nums的nums.length-1位,判断 target 和nums[left] + nums[right]是否相等,如果后者小则left++,如果后者大则right–;直到相等。
var twoSum = function(nums, target) {
var arr = [];
var left = 0;
var right = nums.length - 1;
while(left < right){
var temp = nums[left] + nums[right];
if(temp == target){
arr.push(nums[left]);
arr.push(nums[right]);
break;
}else if(temp < target){
left ++;
}else{
right --;
}
}
return arr;
};