力扣面试(五)
给你一个整数数组
nums
和一个整数k
。每一步操作中,你需要从数组中选出和为
k
的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。
输入:nums = [1,2,3,4], k = 5 输出:2 解释:开始时 nums = [1,2,3,4]: - 移出 1 和 4 ,之后 nums = [2,3] - 移出 2 和 3 ,之后 nums = [] 不再有和为 5 的数对,因此最多执行 2 次操作。
思路:
先将数据进行从小到大排序,然后从队列两侧进行查找,这样性能会更高
int compareInts(const void *a, const void *b) {return *(int *)a - *(int *)b;
}int maxOperations(int* nums, int numsSize, int k){qsort(nums, numsSize, sizeof(int), compareInts);int operations = 0;int left = 0; // Start from the beginning of the arrayint right = numsSize - 1; // Start from the end of the arraywhile (left < right) {int sum = nums[left] + nums[right];if (sum == k) {// Found a pair that sums up to koperations++;left++; // Move the left pointer one step to the rightright--; // Move the right pointer one step to the left} else if (sum < k) {// Increase the sum by moving the left pointer to the rightleft++;} else {// Decrease the sum by moving the right pointer to the leftright--;}}return operations;
}