1679. Max Number of K-Sum Pairs
SourceWeekly Contest 218 Q2DifficultyMediumRating1345
Description
You are given an integer array nums and an integer k.
In one operation, you can pick two numbers from the array whose sum equals k and remove them from the array.
Return the maximum number of operations you can perform on the array.
Example 1:
Input: nums = [1,2,3,4], k = 5 Output: 2 Explanation: Starting with nums = [1,2,3,4]: - Remove numbers 1 and 4, then nums = [2,3] - Remove numbers 2 and 3, then nums = [] There are no more pairs that sum up to 5, hence a total of 2 operations.
Example 2:
Input: nums = [3,1,3,4,3], k = 6 Output: 1 Explanation: Starting with nums = [3,1,3,4,3]: - Remove the first two 3's, then nums = [1,4,3] There are no more pairs that sum up to 6, hence a total of 1 operation.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 1091 <= k <= 109
Solutions
Solution 1: Sorting
Thinking
Pairs must sum to \(k\) and each value is used once. \(n\) is \(10^5\); after sorting, two pointers pair on sum \(k\), move the right end when too large, and the left when too small.
We sort \(nums\). Then \(l\) and \(r\) point to the first and last elements of \(nums\) respectively, and we compare the sum \(s\) of the two integers with \(k\).
- If \(s = k\), it means that we have found two integers whose sum is \(k\). We increment the answer and then move \(l\) and \(r\) towards the middle;
- If \(s > k\), then we move the \(r\) pointer to the left;
- If \(s < k\), then we move the \(l\) pointer to the right;
- We continue the loop until \(l \geq r\).
After the loop ends, we return the answer.
The time complexity is \(O(n \times \log n)\), and the space complexity is \(O(\log n)\). Here, \(n\) is the length of \(nums\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Solution 2: Hash Table
Thinking
Solution 1 sorts. A frequency map of unpaired values pairs \(x\) with \(k-x\) when a leftover exists, otherwise stores \(x\), in linear time.
We use a hash table \(cnt\) to record the current remaining integers and their occurrence counts.
We iterate over \(nums\). For the current integer \(x\), we check if \(k - x\) is in \(cnt\). If it exists, it means that we have found two integers whose sum is \(k\). We increment the answer and then decrement the occurrence count of \(k - x\); otherwise, we increment the occurrence count of \(x\).
After the iteration ends, we return the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of \(nums\).
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |