Leetcode 15 3 sum

1337 ワード

この問題の複雑さはO(n^2)である.問題は、もし私が真ん中を取って、それから左右にそれぞれ取ると、重さを落とすのは複雑さを増すことはありませんが、最後にleetcodeの結果はタイムアウトになります.
最後に最適化された解法は、一番左の値を取って、それから2つの後ろの値を取って、このようにいくつかのテクニックで重くすることができて、もう単独で重くする必要はありません
public class Solution {
    public List> threeSum(int[] nums) {
        List> result = new LinkedList>();
        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 target) {
                        q--;
                    } else {
                        List item = new ArrayList();
                                                item.add(nums[i]);
                        item.add(nums[p]);
                        item.add(nums[q]);
                        result.add(item);
                        p++;
                        q--;
                        //   
                        while(p