[leetcode #1679] Max Number of K-Sum Pairs

Seongyeol Shin·2022년 5월 4일
0

leetcode

목록 보기
186/196
post-thumbnail
post-custom-banner

Problem

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⁵
· 1 <= nums[i] <= 10⁹
· 1 <= k <= 10⁹

Idea

주어진 array에서 두 수를 택해 합이 k가 되는 경우가 몇 가지가 되는지 구하는 문제다. Array에서 각 수는 최대 한 번밖에 사용할 수 없다.

O(n㏒n)으로 풀기 위해 array를 먼저 정렬한다.

두 index i와 j를 사용해서 하나는 앞에서, 다른 하나는 뒤에서 정렬된 array를 탐색한다. 두 수의 합이 k라면 res를 1 올리고 i는 increment, j는 decrement시킨다. 두 수의 합이 k보다 크면 j만 decrement시키고, k보다 작다면 i를 increment하여 가능한 후보를 계속해서 찾는다.

i가 j보다 크다면 모든 수를 탐색한 것이므로 탐색을 마치고 가능한 수를 리턴하면 된다.

Solution

class Solution {
    public int maxOperations(int[] nums, int k) {
        Arrays.sort(nums);

        int i=0, j=nums.length-1;
        int res = 0;
        while (i < j) {
            int sum = nums[i] + nums[j];
            if (sum == k) {
                res++;
                i++;
                j--;
            } else if (sum > k) {
                j--;
            } else {
                i++;
            }
        }

        return res;
    }
}

Reference

https://leetcode.com/problems/max-number-of-k-sum-pairs/

profile
서버개발자 토모입니다
post-custom-banner

0개의 댓글