美文网首页LeetCode每日一题
LeetCode每日一题:三数之和

LeetCode每日一题:三数之和

作者: Patarw | 来源:发表于2020-07-18 15:58 被阅读0次
    • 解题思路:还是熟悉的双指针法
      • 首先把数组nums从小到大进行排序,然后取一个固定的数nums[i],左指针left = i+1,右指针right = nums.length - 1;
      • 三数之和sum = nums[i] + nums[left] + nums[right]
        如果sum = 0,则返回i,left,right;如果sum > 0,则right--;如果sum < 0,则left++。
      • 去重:当 sum == 0 时,nums[left] == nums[left+1] 则会导致结果重复,应该跳过,则left++;nums[right] == nums[right-1]则会导致结果重复,应该跳过,则right--

    代码实现:

       public  List<List<Integer>> threeSum(int[] nums) {
            Arrays.sort(nums);
            ArrayList<List<Integer>> list = new ArrayList<>();
              for(int i = 0;i <= nums.length-3;i++){
                  int left = i+1;
                  int right = nums.length-1;  
                  if(nums[i]>0){break;} //nums[i] > 0时就不需要再遍历了
                  if(i>=1 && nums[i] == nums[i-1]) {continue;}
                  while(left < right){
                 int s = nums[i] + nums[left] + nums[right];
                  if(s == 0 ){
                      list.add(Arrays.asList(nums[i],nums[left],nums[right]));
                      //接下来就是去重操作
                      while(nums[left] == nums[left + 1] && left < right-1){
                         left++;
                     }
                      while(nums[right] == nums[right - 1] && left+1 < right){
                         right--;
                     } 
                    left++;
                     right--;
                  }else if(s < 0){left++;}
                  else if(s > 0){right--;}
                }
              }
              return list;
           }

    相关文章

      网友评论

        本文标题:LeetCode每日一题:三数之和

        本文链接:https://www.haomeiwen.com/subject/ekcfkktx.html