LeetCode[15].三数之和

2024 年 8 月 27 日 星期二
/
7
AI 生成的摘要
此内容由 AI 生成
该算法通过排序、单层循环和双指针的方法来处理重复数字的问题。在循环中,如果当前数字与前一个数字相同,则跳过,以避免结果重复。同时,使用了双指针在重复数字中进行去重,避免停留在最后一个重复数字而导致的错误。

LeetCode[15].三数之和

整体思路是:先排序 + 一重 for 循环 + 双指针

Note

(1) for循环中如果当前数字和上一个数字一样,则直接跳过该数字,否则结果会重复

(2) 关于条件判断中的 while 去重操作,为何要用 while(l<r && nums[l]==nums[++l]); 而不能用while(l<r && nums[l]==nums[l+1]){l++}; 因为后者会停留在重复数字中的最后一个,而不是重复数字的后一个非重数字

[1,2,2,2,3,4] 前者会停留在数字 3 ,而后者会停留在最后一个 2

代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        for(int i = 0;i<nums.length;i++){
            if(nums[i]>0) break;
            //特判!特判!特判!!!!!!!!
            if(i!=0&&nums[i]==nums[i-1]) continue;
            int l = i+1,r = nums.length-1;
            while(l<r){
                int sum = nums[i]+nums[l]+nums[r];
                if(sum==0){
                    ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
                    while(l<r && nums[l]==nums[++l]);
                    while(l<r && nums[r]==nums[--r]);
                }else if(sum<0){
                    while(l<r && nums[l]==nums[++l]);
                }else{
                    while(l<r && nums[r]==nums[--r]);
                }
            }
        }
        return ans;
    }
}
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...