594. Longest Harmonious Subsequence
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