四数之和

四数之和

采用双指针遍历解法。

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;
};

下面是程序流程走向图

在这里插入图片描述

思路

  1. 要用到双指针的话,首先对原数组进行排序,
  2. 先是遍历出一个元素,让这个元素单独一个值,用来和后面的相求和,后面的三个数利用双指针去循环遍历相加(加上最开始排除出来的那个值)得到想要的值,
  3. 双指针 在一个数组有序(从小到大)的情况下,设定左指针为最小,右指针为最大,通过一些条件判定两边指针向中间移动,
    • 举例:求一个数组内等于5的值,假设输入[-2,2,3,-1,5]
      • 运用双指针,先排序之后为[-2,-1,2,3,5],
      • 最小值加上一个最大值,如果说小于了5,那么这么判断,最大值已经是最大了,不可能还有比这个数更大的值了,值小于目标值,说明最小值太小了,所以左边指针向后移动,再次判断,如果大于5的话,同理,当前的左指针为最小,结果还大,最大值大了太多,所以右指针向前移动一位,继续判断。
        5的话,同理,当前的左指针为最小,结果还大,最大值大了太多,所以右指针向前移动一位,继续判断。
  4. 每一次相加的值是i和后面构成的数组的数相加得来的,所以最后计算出相对应的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值