Algobase
  • Introduction
  • Leetcode
    • 226. Invert Binary Tree
    • 136. Single Number
    • 104. Maximum Depth of Binary Tree
    • 344. Reverse String
    • 461. Hamming Distance
    • 617. Merge Two Binary Trees
    • 237. Delete Node in a Linked List
    • 412. Fizz Buzz
    • 206. Reverse Linked List
    • 169. Majority Element
    • 108. Convert Sorted Array to Binary Search Tree
    • 283. Move Zeroes
    • 122. Best Time to Buy and Sell Stock II
    • 242. Valid Anagram
    • 171. Excel Sheet Column Number
    • 217. Contains Duplicate
    • 448. Find All Numbers Disappeared in an Array
    • 13. Roman to Integer
    • 21. Merge Two Sorted Lists
    • 100. Same Tree
    • 121. Best Time to Buy and Sell Stock
    • 350. Intersection of Two Arrays II
    • 268. Missing Number
    • 118. Pascal's Triangle
    • 387. First Unique Character in a String
    • 38. Count and Say
    • 26. Remove Duplicates from Sorted Array
    • 1. Two Sum
    • 53. Maximum Subarray
    • 101. Symmetric Tree
    • 70. Climbing Stairs
    • 543. Diameter of Binary Tree
    • 9. Palindrome Number
    • 191. Number of 1 Bits
    • 202. Happy Number
    • 326. Power of Three
    • 198. House Robber
    • 66. Plus One
    • 724. Find Pivot Index
    • 155. Min Stack
    • 14. Longest Common Prefix
    • 278. First Bad Version
    • 125. Valid Palindrome
    • 172. Factorial Trailing Zeros
    • 20. Valid Parentheses
    • 234. Palindrome Linked List
    • 88. Merge Sorted Array
    • 190. Reverse Bits
    • 160. Intersection of Two Linked Lists
    • 141. Linked List Cycle
    • 189. Rotate Array
    • 28. Implement strStr()
    • 69. Sqrt(x)
    • 204. Count Primes
    • 581. Shortest Unsorted Continuous Subarray
    • 7. Reverse Integer
    • 763. Partition Labels
    • 338. Counting Bits
    • 406. Queue Reconstruction by Height
    • 46. Permutations
    • 94. Binary Tree Inorder Traversal
    • 739. Daily Temperature
    • 22. Generate Parentheses
    • 78. Subsets
    • 347. Top K Frequent Elements
    • 647. Palindromic Substrings
    • 230. Kth Smallest Element in a BST
    • 238. Product of Array Except Self
    • 1143. Longest Common Subsequence
    • 48. Rotate Image
    • 49. Group Anagrams
    • 39. Combination Sum
    • 454. 4Sum II
    • 62. Unique Paths
    • 378. Kth Smallest Element in a Sorted Matrix
    • 64. Minimum Path Sum
    • 102. Binary Tree Level Order Traversal
    • 289. Game of Life
    • 145. Binary Tree Postorder Traversal
    • 287. Find the Duplicate Number
    • 215. Kth Largest Element in an Array
    • 328. Odd Even Linked List
    • 875. Koko Eating Bananas
    • 384. Shuffle an Array
    • 341. Flatten Nested List Iterator
    • 96. Unique Binary Search Trees
    • 11. Container With Most Water
    • 337. House Robber III
    • 394. Decode String
    • 371. Sum of Two Integers
    • 621. Task Scheduler
    • 208. Implement Trie (Prefix Tree)
    • 114. Flatten Binary Tree to Linked List
    • 105. Construct Binary Tree from Preorder and Inorder Traversal
    • 75. Sort Colors
    • 131. Palindrome Partitioning
    • 103. Binary Tree Zigzag Level Order Traversal
    • 36. Valid Sudoku
    • 17. Letter Combinations of a Phone Number
    • 309. Best Time to Buy and Sell Stock with Cooldown
    • 279. Perfect Squares
    • 380. Insert Delete GetRandom O(1)
    • 116. Populating Next Right Pointers in Each Node
    • 236. Lowest Common Ancestor of a Binary Tree
    • 200. Number of Islands
    • 437. Path Sum III
    • 416. Partition Equal Subset Sum
    • 1049. Last Stone Weight II
    • 494. Target Sum
    • 16. 3Sum Closest
    • 148. Sort List
    • 207. Course Schedule
    • 560. Subarray Sum Equals K
    • 438. Find All Anagrams in a String
    • 300. Longest Increasing Subsequence
    • 240. Search a 2D Matrix II
    • 162. Find Peak Element
    • 73. Set Matrix Zeroes
    • 134. Gas Station
    • 139. Word Break
    • 210. Course Schedule II
    • 395. Longest Substring with At Least K Repeating Characters
    • 787. Cheapest Flights Within K Stops
    • 56. Merge Intervals
    • 334. Increasing Triplet Subsequence
    • 713. Subarray Product Less Than K
    • 142. Linked List Cycle II
    • 221. Maximal Square
    • 138. Copy List with Random Pointer
    • 227. Basic Calculator II
    • 6. ZigZag Conversion
    • 150. Evaluate Reverse Polish Notation
    • 34. Find First and Last Position of Element in Sorted Array
    • 322. Coin Change
    • 79. Word Search
    • 19.Remove Nth Node From End of List
    • 33. Search in Rotated Sorted Array
    • 63. Unique Paths II
    • 146. LRU Cache
    • 2. Add Two Numbers
    • 54. Spiral Matrix
    • 55. Jump Game
    • 50. Pow(x, n)
    • 3. Longest Substring Without Repeating Characters
    • 152. Maximum Product Subarray
    • 5. Longest Palindromic Substring
    • 179. Largest Number
    • 324. Wiggle Sort II
    • 127. Word Ladder
    • 91. Decode Ways
    • 15. 3Sum
    • 98. Validate Binary Search Tree
    • 130. Surrounded Regions
    • 8. String to Integer (atoi)
    • 29. Divide Two Integers
    • 166. Fraction to Recurring Decimal
    • 72. Edit Distance
    • 295. Find Median from Data Stream
    • 123. Best Time to Buy and Sell Stock III
    • 829. Consecutive Numbers Sum
    • 31. Next Permutation
    • 173. Binary Search Tree Iterator
    • 92. Reverse Linked List II
    • 95. Unique Binary Search Trees II
    • 24. Swap Nodes in Pairs
    • 209. Minimum Size Subarray Sum
    • 199. Binary Tree Right Side View
    • 120. Triangle
    • 188. Best Time to Buy and Sell Stock IV
    • 442. Find All Duplicates in an Array
    • 222. Count Complete Tree Nodes
    • 47. Permutations II
    • 109. Convert Sorted List to Binary Search Tree
    • 18. 4Sum
    • 153. Find Minimum in Rotated Sorted Array
    • 654. Maximum Binary Tree
    • 695. Max Area of Island
    • 547. Friend Circles
    • 43. Multiply Strings
    • 310. Minimum Height Trees
    • 516. Longest Palindromic Subsequence
    • 241. Different Ways to Add Parentheses
    • 863. All Nodes Distance K in Binary Tree
    • 143. Reorder List
    • 402. Remove K Digits
    • 450. Delete Node in a BST
  • Algorithms & Data Structure
    • Sorting
  • Leetcode SQL
Powered by GitBook
On this page
  • Problem
  • Solution

Was this helpful?

  1. Leetcode

18. 4Sum

https://leetcode.com/problems/4sum/

Problem

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Notice that the solution set must not contain duplicate quadruplets.

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 = [], target = 0
Output: []

Constraints:

  • 0 <= nums.length <= 200

  • -109 <= nums[i] <= 109

  • -109 <= target <= 109

Solution

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> quad;
        const int n = nums.size();
        if (n < 4) return quad;
        sort(nums.begin(), nums.end());
        unordered_set<int> seen;
        seen.reserve(n);        
        for (int i = 0; i < n; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1; j < n; ++j) {
                if (j > i + 1 && nums[j - 1] == nums[j]) continue;
                for (int k = j + 1; k < n; ++k) {   
                    const int sum = target-nums[i]-nums[j]-nums[k];
                    if (seen.find(sum) != seen.end()) {
                        quad.push_back({nums[i], nums[j], sum, nums[k]});
                        while (k + 1 < n && nums[k] == nums[k + 1]) ++k;
                    }
                    seen.insert(nums[k]);
                }
                seen.clear();
            }
            
        }
        return quad;
    }
};
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        return kSum(nums, 0, 4, target);
    }
    vector<vector<int>> kSum(vector<int>&nums, int start, int k, int target) {
        vector<vector<int>> combs;
        if (k == 2) return twoSum(nums, start, target); 
        for (int i = start; i < nums.size(); ++i) {
            if (i > start && nums[i - 1] == nums[i]) continue;
            auto _combs = kSum(nums, i + 1, k - 1, target - nums[i]);
            for (auto &comb: _combs) {
                comb.push_back(nums[i]);
                combs.push_back(comb);
            }
        }
        return combs;
    }
    vector<vector<int>> twoSum(vector<int>&nums, int start, int target) {
        vector<vector<int>> combs;
        int end = nums.size() - 1;
        while (start < end) {
            const int sum = nums[start] + nums[end];
            if (sum == target) {
                combs.push_back({nums[start++], nums[end--]});
                while (start < end && nums[start - 1] == nums[start]) ++start;
                while (start <= end && nums[end] == nums[end + 1]) --end;
            } else if (sum < target){
                ++start;
            } else {
                --end;
            }
        }
        
        return combs;
    }
};
  • #veryimportant

  • #twopointer

  • #recursive

Previous109. Convert Sorted List to Binary Search TreeNext153. Find Minimum in Rotated Sorted Array

Last updated 4 years ago

Was this helpful?