问题描述
给你一个整数数组 nums 和一个整数 k 。每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。
解析
最容易想到的就是二重循环去找,但这种方式不仅空间复杂度高,而且还需要利用额外的空间去记录,实际上可以使用双指针。如果是正常有序的列表,并且是等差数列,那么其首尾之和一定是相同的,可以利用这个结论去解决这个问题。对于有序的列表,左指针右移和增大,右指针左移和减小。首先排序,同样从首尾开始,此时有三种情况,相等,满足条件,和大,左指针移动,和小,右指针移动。
public int maxOperations(int[] nums, int k) {
Arrays.sort(nums);
int left = 0;
int right = nums.length - 1;
int res = 0;
while(left < right){
if(nums[left] + nums[right] == k){
res++;
left ++;
right --;
}
else if(nums[left]+nums[right]<k){
left++;
}
else{
right--;
}
}
return res;
}