那道题就是想怎么遍历,怎么把问题转换成遍历的问题就完事了
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。
明白了这两个哈希表的作用,我们就可以看懂解法了: