玩个斗地主也能玩出算法?

那道题就是想怎么遍历,怎么把问题转换成遍历的问题就完事了

1、当前元素v自成一派,「以自己开头」构成一个长度至少为 3 的序列。

比如输入nums = [1,2,3,6,7,8],遍历到元素6时,它只能自己开头形成一个符合条件的子序列[6,7,8]2、当前元素v接到已经存在的子序列后面。

比如输入nums = [1,2,3,4,5],遍历到元素4时,它只能接到已经存在的子序列[1,2,3]后面。它没办法自成开头形成新的子序列,因为少了个6。

但是,如果这两种情况都可以,应该如何选择?

比如说,输入nums = [1,2,3,4,5,5,6,7],对于元素4,你说它应该形成一个新的子序列[4,5,6]还是接到子序列[1,2,3]后面呢?

显然,nums数组的正确划分方法是分成[1,2,3,4,5][5,6,7],所以元素4应该优先判断自己是否能够接到其他序列后面,如果不行,再判断是否可以作为新的子序列开头。

这就是整体的思路,想让算法代码实现这两个选择,需要两个哈希表来做辅助:

freq哈希表帮助一个元素判断自己是否能够作为开头,need哈希表帮助一个元素判断自己是否可以被接到其他序列后面。

freq记录每个元素出现的次数,比如freq[3] == 2说明元素3在nums中出现了 2 次。

那么如果我发现freq[3], freq[4], freq[5]都是大于 0 的,那就说明元素3可以作为开头组成一个长度为 3 的子序列。

need记录哪些元素可以被接到其他子序列后面。

比如说现在已经组成了两个子序列[1,2,3,4][2,3,4],那么need[5]的值就应该是 2,说明对元素5的需求为 2。

明白了这两个哈希表的作用,我们就可以看懂解法了:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值