18. 4Sum

QUESTION:

Given an array nums of n integers, return an array of all the unique quadruplets [nums[a], nums[b], nums[c], nums[d]] such that:

0 <= a, b, c, d < n a, b, c, and d are distinct. nums[a] + nums[b] + nums[c] + nums[d] == target You may return the answer in any order.

Example 1:

Input: nums = [1,0,-1,0,-2,2], target = 0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

Example 2:

Input: nums = [2,2,2,2,2], target = 8
Output: [[2,2,2,2]]

Constraints:

1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

EXPLANATION:

SOLUTION:

class Solution {
    func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] {
        guard nums.count >= 4 else { return [] }
        let nums = nums.sorted()
        var result = Set<[Int]>()
        
        for a in 0 ..< nums.count - 3 {
            for b in a+1 ..< nums.count - 2 {
                var c = b + 1, d = nums.count - 1
                while c < d {
                    let diff = nums[a] + nums[b] + nums[c] + nums[d] - target
                    if diff == 0 {
                        result.insert([nums[a], nums[b], nums[c], nums[d]])
                    }
                    if diff < 0 {
                        let lastC = nums[c]
                        repeat {
                            c += 1
                        } while c < d && lastC == nums[c] 
                    } else {
                        let lastD = nums[d]
                        repeat {
                            d -= 1
                        } while c < d && lastD == nums[d] 
                    }
                }
            }
        }
        return Array(result)
    }
}