4sum

这道题就是在3sum的模板上再套一层循环而已,查重机制也是一模一样的,下面是代码,时间下界就是O(n^3)了

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        n = len(nums)
        A = 0                        # 大写代表坐标,小写代表对应值
        nums.sort()
        res = []

        while A <= n - 4:
            a = nums[A]
            if A > 0 and nums[A] == nums[A - 1]:
                A += 1
                continue
            B = A + 1
            while B <= n - 3:
                b = nums[B]
                if B > A + 1 and nums[B] == nums[B - 1]:
                    B += 1
                    continue
                C, D = B + 1, n - 1
                while C <= D - 1:
                    c, d = nums[C], nums[D]
                    if a + b + c + d == target:
                        res.append([a, b, c, d])
                        while D > C and nums[D] == nums[D - 1]:
                            D -= 1
                        while D > C and nums[C] == nums[C + 1]:
                            C += 1
                        D -= 1
                    elif a + b + c + d < target:
                        C += 1
                    else:
                        D -= 1
                B += 1
            A += 1

        return res

Java版本,注意如何初始化一个arrayList的

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        int ori = 0;
        int n = nums.length;

        while (ori <= n - 4) {
            int a = nums[ori];
            if (ori > 0 && nums[ori] == nums[ori - 1]) {
                ori++;
                continue;
            }
            int base = ori + 1;
            while (base <= n - 3) {
                int b = nums[base];
                if (base > ori + 1 && nums[base] == nums[base - 1]) {
                    base++;
                    continue;
                }
                int start = base + 1;
                int end = n - 1;
                while (start <= end - 1) {
                    int c = nums[start];
                    int d = nums[end];
                    if (a + b + c + d == target) {
                        result.add(new ArrayList<>(Arrays.asList(a, b, c, d)));
                        while (start < end && nums[start] == nums[start + 1]) {
                            start++;
                        }
                        while (start < end && nums[end] == nums[end - 1]) {
                            end--;
                        }
                        end--;
                    } else if (a + b + c + d < target) {
                        start++;
                    } else {
                        end--;
                    }
                }
                base++;
            }
            ori++;
        }
        return result;
    }
}

results matching ""

    No results matching ""