15、三数之和(利用双指针(三指针)))

该代码使用排序后的双指针策略解决三数之和问题,避免了暴力遍历并优化了去重过程。通过遍历排序后的数组,当当前元素大于0时结束,以确保三数之和不会小于0。同时,利用指针移动和条件判断来寻找和为0的三元组,并在找到解后进行去重处理,以获取所有不重复的解。
摘要由CSDN通过智能技术生成

1.暴力
2.双指针
关键字:不可以包含重复
模式识别:利用排序避免重复答案

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res=new ArrayList<>();
        //遍历数组
        for(int i=0;i<nums.length;i++){
            //如果遍历的起始元素大于0,就直接退出
            //原因,此时数组为有序的数组,最小的数都大于0了,三数之和肯定大于0
            if(nums[i]>0){
                break;
            }
            if(i>=1&&nums[i-1]==nums[i]) continue;
            int left=i+1;
            int right=nums.length-1;
            //外面需要套一层大循环(即使找到正确解也可能还有别的解所以要一直找下去)
            while(left<right){
                if(nums[right]+nums[left]+nums[i]==0){
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    //把结果添加之后去重
                    while(left<right&&nums[right]==nums[right-1]){
                        right--;
                    }
                    while(left<right&&nums[left]==nums[left+1]){
                        left++;
                    }
                    //去重后将指针移动到正确位置
                    right--;
                    left++;
                }else if(nums[right]+nums[left]+nums[i]>0) right--;
                else if(nums[right]+nums[left]+nums[i]<0) left++;
            }    
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值