leecode 75-13 python K 和数对的最大数目

  本人新手一枚,希望大佬们及时指导我的错误,万分感谢。

题目地址

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

望各位大佬批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值