Welcome to Subscribe On Youtube
1679. Max Number of K-Sum Pairs
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 <= 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$.
Solution 2: Hash Table
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$.
-
class Solution { public int maxOperations(int[] nums, int k) { Arrays.sort(nums); int l = 0, r = nums.length - 1; int ans = 0; while (l < r) { int s = nums[l] + nums[r]; if (s == k) { ++ans; ++l; --r; } else if (s > k) { --r; } else { ++l; } } return ans; } }
-
class Solution { public: int maxOperations(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); int cnt = 0; int i = 0, j = nums.size() - 1; while (i < j) { if (nums[i] + nums[j] == k) { i++; j--; cnt++; } else if (nums[i] + nums[j] > k) { j--; } else { i++; } } return cnt; } };
-
class Solution: def maxOperations(self, nums: List[int], k: int) -> int: nums.sort() l, r, ans = 0, len(nums) - 1, 0 while l < r: s = nums[l] + nums[r] if s == k: ans += 1 l, r = l + 1, r - 1 elif s > k: r -= 1 else: l += 1 return ans
-
func maxOperations(nums []int, k int) int { sort.Ints(nums) l, r, ans := 0, len(nums)-1, 0 for l < r { s := nums[l] + nums[r] if s == k { ans++ l++ r-- } else if s > k { r-- } else { l++ } } return ans }
-
function maxOperations(nums: number[], k: number): number { const cnt = new Map(); let ans = 0; for (const x of nums) { if (cnt.get(k - x)) { cnt.set(k - x, cnt.get(k - x) - 1); ++ans; } else { cnt.set(x, (cnt.get(x) | 0) + 1); } } return ans; }
-
impl Solution { pub fn max_operations(nums: Vec<i32>, k: i32) -> i32 { let mut nums = nums.clone(); nums.sort(); let (mut l, mut r, mut ans) = (0, nums.len() - 1, 0); while l < r { match nums[l] + nums[r] { sum if sum == k => { ans += 1; l += 1; r -= 1; } sum if sum > k => { r -= 1; } _ => { l += 1; } } } ans } }