Leetcode
1679. Max Number of K-Sum Pairs

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 <= 10^5
  • 1 <= nums[i] <= 10^9
  • 1 <= k <= 10^9

My Solution

 
// using Two Pointers
var maxOperations = function (nums, k) {
  nums.sort((a, b) => a - b);
  let count = 0;
  let left = 0;
  let right = nums.length - 1;
  while(left < right) {
    if (nums[left] + nums[right] === k) {
      count++;
      left++;
      right--;
    } else if (nums[left] + nums[right] < k) {
      left++;
    } else {
      right--;
    }
  }
  return count;
}
 

Solution from others

 
// using Hash Map
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var maxOperations = function (nums, k) {
  let map = new Map(); // A hashmap to store the frequency of each number
  let count = 0;
  for (let num of nums) {
    let complement = k - num; // Calculate the complement of the current number that would sum up to k
 
    // If the complement is in the hashmap and has a frequency greater than 0,
    // it means we've found a pair. So, increase the count and decrease the frequency of the complement.
    if (map.get(complement) > 0) {
      count++;
      map.set(complement, map.get(complement) - 1);
    } else {
      // If the complement is not present, add or update the current number's frequency in the hashmap.
      map.set(num, (map.get(num) || 0) + 1);
    }
  }
  return count;
}