本人新手一枚,希望大佬们及时指导我的错误,万分感谢。
题目地址
LeetCode 75 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
给你一个整数数组 nums
和一个整数 k
。
每一步操作中,你需要从数组中选出和为 k
的两个整数,并将它们移出数组。
返回你可以对数组执行的最大操作数。
示例 1:
输入:nums = [1,2,3,4], k = 5 输出:2 解释:开始时 nums = [1,2,3,4]: - 移出 1 和 4 ,之后 nums = [2,3] - 移出 2 和 3 ,之后 nums = [] 不再有和为 5 的数对,因此最多执行 2 次操作。
示例 2:
输入:nums = [3,1,3,4,3], k = 6 输出:1 解释:开始时 nums = [3,1,3,4,3]: - 移出前两个 3 ,之后nums = [1,4,3] 不再有和为 6 的数对,因此最多执行 1 次操作。
【1】这道题很明显,如果在乱序情况下,很难通过双指针来解出来,所以我的想法是,先排序,再进行双指针操作。
step1:先sort()排序下
step2:双指针指向两端,和接雨水那题有点像了,如果两个指针指向的数的和,小于k则左指针右移动,小于则右指针左移,相等则满足条件,两个指针都移动并计数。
class Solution:
def maxOperations(self, nums: List[int], k: int) -> int:
#step1
nums.sort()
#step2
i, j = 0, len(nums)-1
count = 0
while i < j:
sum_ij = nums[i] + nums[j]
if sum_ij < k:
i += 1
elif sum_ij == k:
i += 1
j -= 1
count += 1
else:
j -= 1
return count
【2】写完上边的双指针方法,突然感觉,这题可以用哈希表,于是我来大胆尝试下。
还是挺好写的
step1:先来个counter计数
step2:遍历计数字典的key,找到对应k-key的计数,把两者最小的值拿出来计数
step3:最后一定要除以2,因为遍历后,每一对都计了两遍。
class Solution:
def maxOperations(self, nums: List[int], k: int) -> int:
count_num = Counter(nums)
count = 0
for key in count_num:
count += min(count_num[key], count_num.get(k-key, 0))
return count//2
望各位大佬批评指正