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⁹
주어진 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보다 크다면 모든 수를 탐색한 것이므로 탐색을 마치고 가능한 수를 리턴하면 된다.
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;
}
}