LeetCode每日一题:三数之和

  • 解题思路:还是熟悉的双指针法
    • 首先把数组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;
       }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容