刷题 --三数之和

在这里插入图片描述
思路如下:
遍历一遍数组
其中过程设立左右两个指针进行判断遍历
我们设置 left为做指针 right为右指针
因为已经有序了 当nums[i]为正数的时候就不可能 在以后的数字中找到和为0
nums[i]+nums[left]+nums[right] =0 添加结果 <0说明左边太小 left++ >0说明右边太大 right–
注意为零后我们仍然不能就此退出当前,有可能下面还有使结果为零的组合
所以任然要继续left和right指针移动 但是当有重复的要掠过
因为
if(i>0 && nums[i]==nums[i-1]) continue;
判断nums[i]是否重复 开头是否重复
while(left < right && nums[left+1] == nums[left]) ++left;
while (left < right && nums[right-1] == nums[right]) --right;
判断中间和右边是否重复


class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> listAll = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        /*
        思路如下:
        遍历一遍数组
        其中过程设立左右两个指针进行判断遍历
        我们设置 left为做指针 right为右指针
        因为已经有序了 当nums[i]为正数的时候就不可能 在以后的数字中找到和为0
        nums[i]+nums[left]+nums[right]  =0 添加结果  <0说明左边太小  left++     >0说明右边太大 right--
       */
        if(nums.length<3) return listAll;
        int len  = nums.length;
        for( int i = 0; i < len ; i++){
            if(nums[i] > 0) break;
            int left = i+1;
            int right =len-1;
            if(i>0  && nums[i]==nums[i-1]) continue;
            while(left < right){
                 int sum = nums[i]+nums[left]+nums[right];
                 if(sum == 0){
                     List<Integer> list = new ArrayList<>();
                     list.add(nums[i]);
                     list.add(nums[left]);
                     list.add(nums[right]);
                     listAll.add(list); 
                     //接下来要判断下一个 元素是不是和当前元素相等,如果相等掠过
                     while(left < right && nums[left+1] == nums[left]) ++left;
                     while (left < right && nums[right-1] == nums[right]) --right;
                     //执行完要向前签进  之前就忘了这个 为零时的后面要++
                     ++left;
                     --right;
                     
                 }
                 if(sum < 0 )
                 left++;
                 if(sum>0)
                 right--;
            }
        }

        return listAll;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值