LeetCode-Hot100-006三数之和

思路

先排序解决重复的问题。再三重循环遍历,但是第二重和第三重使用双指针的做法,复杂度降低为 O ( n 2 ) O(n^2) O(n2)

代码

本次代码来自于力扣官方题解评论区,非本人原创,请注意

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums); // 先排序
        List<List<Integer>> res = new ArrayList<>();
        
        for (int i = 0; i < nums.length; i++) {
            // 跳过重复元素
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            
            // 双指针,目标是找到 nums[l] + nums[r] = -nums[i]
            int l = i + 1, r = nums.length - 1;
            int target = -nums[i];
            
            while (l < r) {
                int sum = nums[l] + nums[r];
                if (sum == target) {
                    res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    l++;
                    r--;
                    // 跳过重复元素
                    while (l < r && nums[l] == nums[l - 1]) l++;
                    while (l < r && nums[r] == nums[r + 1]) r--;
                } else if (sum < target) {
                    l++;
                } else {
                    r--;
                }
            }
        }
        return res;
    }
}

你可能感兴趣的:(LeetCode100题,leetcode,数据结构,排序算法,算法,c++,蓝桥杯,java)