15.三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums); // 先对数组排序,便于使用双指针和去重
        
        // 外层循环固定第一个数a(索引i),转化为寻找b + c = -a的问题
        for (int i = 0; i < nums.length; i++) {
            // 剪枝:如果a已经大于0,由于数组有序,后续无法组成和为0的三元组
            if (nums[i] > 0) { 
                return result; // 直接返回结果
            }
            
            // 对a去重:跳过连续相同的a值(需保证i>0防止越界)
            if (i > 0 && nums[i] == nums[i - 1]) { 
                continue;
            }
            
            // 双指针初始化:left指向i的下一个位置(b),right指向末尾(c)
            int left = i + 1;
            int right = nums.length - 1;
            
            // 双指针寻找满足条件的b和c
            while (right > left) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum > 0) { // 和过大,需要减小,右指针左移
                    right--;
                } else if (sum < 0) { // 和过小,需要增大,左指针右移
                    left++;
                } else { // 找到有效三元组
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    
                    // 对b和c去重:跳过连续的相同值
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    
                    // 收缩双指针继续寻找其他可能组合
                    right--; 
                    left++;
                }
            }
        }
        return result;
    }
}
posted @ 2025-05-22 21:59  星星永远发着光  阅读(6)  评论(0)    收藏  举报