594. 最长和谐子序列
题目
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例
输入:nums=[1,3,2,2,5,2,3,7]
输出:5
解释:最长和谐子序列是[3,2,2,2,3]
这道题我一开始的思路是做一个字典,把不重复的元素存进去,然后将keys相差1的key取出来,然后将这个key对应的下标的最小小标作为列表的起始位置,再遍历原列表,找出和这两个keys相同的元素,并将这些元素取出,并统计长度。不过当我落地写的时候,崩了,完全把自己绕死
class Solution:
def findLHS(self, nums: List[int]) -> int:
if len(nums)<=0:return 0
if len(nums)==1: return 1
hash_map={}
max_len=0
for i in range(0,len(nums)):
if nums[i] not in hash_map:
hash_map[nums[i]]=i
keys=[]
print(hash_map)
for j in hash_map.keys():
keys.append(j)
print("keys:",keys)
for k in range(0,len(keys)-1):
if abs(keys[k]-keys[k+1])==1:
print("k:",k,k+1)
start_key=hash_map[k]
start=k
end_key=hash_map[k+1]
end=k+1
print(start_key,end_key)
result=[]
print(start_key,end_key)
for i in range(start,len(nums)):
if nums[i]==start_key or nums[i]==end_key:
result.append(nums[i])
print(result)
return len(result)
后来看了一下答案,我才发现只有做字典这里我是和他一样,其他好像都不同,他的思路是hashmap 存储每个字符出现的次数,然后遍历哈希表,将哈希表的key值加1,看是否有这样的key+1的元素,如果有,说明就可以和key组成和谐序列,然后将key+1的value和当前的k的value值相加,就可以返回数组长度
class Solution:
def findLHS(self,nums:List[int])->int:
if not nums:return 0
if len(nums)<2:return 0
hash_map={}
for num in nums:
hash_map[num]=hash_map.get(num,0)+1
res=0
for k,v in hash_map.items():
if hash_map.get(k+1,0)!=0:
res=max(res,hash_map.get(k+1)+v)
return res
测试用例
def findLHS(nums):
if not nums:return 0
if len(nums)<2:return 0
hashmap=dict()
for num in nums:
#dict.get(key,0) 这里是提取key对应的value值
hashmap[num]=hashmap.get(num,0)+1
res=0
for k,v in hashmap.items():
print("k+1,hash:",k+1,hashmap.get(k+1,0))
if hashmap.get(k+1,0)!=0:#k+1是为了找出和key值相差1的元素,然后通过hashmap取出这个元素在原列表中的个数
res=max(res,hashmap.get(k+1)+v)
print(findLHS([1,3,2,2,5,2,3,7]))