美文网首页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