leedcode-哈希表篇(3)

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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值