594. Longest Harmonious Subsequence

题目

主要意思就是找个一个数字子集,里面的最大值和最小值的差为1.
在这里插入图片描述

解题思路

使用Counter计算每个数字出现的次数,然后用set列出里面的数字,转为为list后排序,然后对item的值 判断,item+1是否存在,如果存在计算出子集长度和最大值比较,最后返回最大值。

我的代码(效率挺低)

from collections import Counter
class Solution:
    def findLHS(self, nums: List[int]) -> int:
        cnt = Counter()
        items=list(set(nums))
        items.sort()
        for n in nums:
            cnt[n]+=1
        ans=0
        for i in items:
            if cnt[i+1]!=0:
                length=cnt[i+1]+cnt[i]
                if length>ans:
                    ans=length
        return ans

优秀代码

from collections import defaultdict, Counter
class Solution:
    def findLHS(self, nums: 'List[int]') -> 'int':
        m = Counter(nums)
        return max([m[k] + m[k+1] for k in m if k+1 in m] or [0])

效率差异点:

  • m = Counter(nums) 可以直接构造计数器。
  • 我之前犯了错误,无需排序,只需要定向找更大的或者更小的就行。
  • [m[k] + m[k+1] for k in m if k+1 in m] or [0]
    如果[m[k] + m[k+1] for k in m if k+1 in m]存在那么取这个否则取[0]
class Solution:
    def findLHS(self, nums: List[int]) -> int:
        c = collections.Counter(nums)
        return max((c[k-1]+v for k,v in c.items() if k-1 in c), default=0)

max((c[k-1]+v for k,v in c.items() if k-1 in c), default=0) 使用了default实现了与or一样的效果。

逻辑清晰:

class Solution:
    def findLHS(self, nums: List[int]) -> int:
        c = collections.Counter(nums)
        ans = 0
        for k in c:
            if k+1 in c:
                ans = max(ans, c[k] + c[k+1])
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值