四数之和
采用双指针遍历解法。
var fourSum = function(nums, target) {
var sortNums=nums.sort((a,b)=>a-b);
var length=nums.length;
var result=[];
if(!nums||length<4) return result;
for(var i=0;i<length;i++){
if(i>0&&sortNums[i]===sortNums[i-1]) continue;// 去重
for(var j=i+1;j<length;j++){
if(j>i+1&&sortNums[j]===sortNums[j-1]) continue;// 去重
var l=j+1;
var r=sortNums.length-1;
while(l<r){
var sum=sortNums[i]+sortNums[j]+sortNums[l]+sortNums[r];
if(sum===target){
result.push([sortNums[i],sortNums[j],sortNums[l],sortNums[r]]);
while(l<r&&sortNums[l]===sortNums[l+1]) l++;
while(l<r&&sortNums[r]===sortNums[r-1]) r--;
l++;
r--;
}
else if(sum>target) r--;
else if(sum<target) l++;
}
}
}
return result;
};
下面是程序流程走向图
思路
- 要用到双指针的话,首先对原数组进行排序,
- 先是遍历出一个元素,让这个元素单独一个值,用来和后面的相求和,后面的三个数利用双指针去循环遍历相加(加上最开始排除出来的那个值)得到想要的值,
- 双指针 在一个数组有序(从小到大)的情况下,设定左指针为最小,右指针为最大,通过一些条件判定两边指针向中间移动,
- 举例:求一个数组内等于5的值,假设输入[-2,2,3,-1,5]
- 运用双指针,先排序之后为[-2,-1,2,3,5],
- 最小值加上一个最大值,如果说小于了5,那么这么判断,最大值已经是最大了,不可能还有比这个数更大的值了,值小于目标值,说明最小值太小了,所以左边指针向后移动,再次判断,如果大于5的话,同理,当前的左指针为最小,结果还大,最大值大了太多,所以右指针向前移动一位,继续判断。
5的话,同理,当前的左指针为最小,结果还大,最大值大了太多,所以右指针向前移动一位,继续判断。
- 举例:求一个数组内等于5的值,假设输入[-2,2,3,-1,5]
- 每一次相加的值是i和后面构成的数组的数相加得来的,所以最后计算出相对应的值。