1679. Max Number of K-Sum Pairs
Tags
- Array
- Hash Table
- Two Pointers
- Sorting
Link
Question
You are given an integer array
nums
and an integerk
.
In one operation, you can pick two numbers from the array whose sum equalsk
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 <= 10
51 <= nums[i] <= 10
91 <= k <= 10
9
Answer
JavaScript
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var maxOperations = function (nums, k) {
const hashMap = new Map();
let count = 0;
for (let num of nums) {
let complement = k - num;
//if hashmap has complement of current num, simply decrement complement and increment count
if (hashMap.has(complement) && hashMap.get(complement) > 0) {
hashMap.set(complement, hashMap.get(complement) - 1);
count++;
//else add current num to hashmap, or increment if num already in hashmap
} else {
hashMap.has(num)
? hashMap.set(num, hashMap.get(num) + 1)
: hashMap.set(num, 1);
}
}
return count;
};
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var maxOperations = function (nums, k) {
let addends = new Map();
let operations = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] >= k) continue;
addends.has(nums[i])
? addends.set(nums[i], addends.get(nums[i]) + 1)
: addends.set(nums[i], 1);
}
for (const [key, entry] of addends) {
const complement = k - key;
if (complement == key) operations += Math.floor(addends.get(key) / 2);
else if (addends.has(complement)) {
operations += Math.min(addends.get(complement), addends.get(key));
}
addends.delete(key);
addends.delete(complement);
}
return operations;
};
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var maxOperations = function (nums, k) {
let m = new Map(),
ans = 0;
for (let n of nums)
if (n < k)
if (m.get(k - n)) m.set(k - n, m.get(k - n) - 1), ans++;
else m.set(n, (m.get(n) || 0) + 1);
return ans;
};