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 <= 105
1 <= nums[i] <= 109
1 <= k <= 109
Solutions
Solution 1: Sorting
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\).
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\).