这道题的复杂度是O(n^2)。问题是这样的,如果我取中间,然后再左右各取的话,去重虽然不会增加复杂度,但是最后leetcode结果还是会超时。

最后优化的解法是这样的,取最左边的值,然后在取两个后面的值,这样可以用一些技巧去重,不用再单独去重了

public class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new LinkedList<List<Integer>>();
        if (nums.length < 3) {
            return result;
        }
        
        Arrays.sort(nums);
        
        for (int i = 0; i < nums.length - 2; i++) {
            // 关键
            if(i==0 || nums[i] > nums[i-1]) {
            
                int target = -nums[i];
                int p = i+1;
                int q = nums.length - 1;
                while (p<q) {
                    if (nums[p] + nums[q] < target) {
                        p++;
                    } else if (nums[p] + nums[q] > target) {
                        q--;
                    } else {
                        List<Integer> item = new ArrayList<Integer>();
                                                item.add(nums[i]);
                        item.add(nums[p]);
                        item.add(nums[q]);
                        result.add(item);
                        p++;
                        q--;
                        // 关键
                        while(p<q && nums[p]==nums[p-1])
                            p++;
                        while(p<q && nums[q]==nums[q+1])
                            q--;
                        continue;
                    }
                }
            }
        }
        
        
        return result;
        
    }
}

chenatu
106 声望12 粉丝