【LeetCode】第 k 个数 Java 题解
题目描述
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
复制代码
思路分析
今天的算法题目是求第 k 个数, 根据题目描述, 数值的计算算法是素因子只有 3,5,7。而且我们需要对计算出的数值进行从小到大的排序。理解了题意之后,我们可以按照计算规则,计算数据,然后将所有的计算结果进行去重存储排序。
对于数据去重,我们一般使用 Set 数据结构,可以保持容器中的元素不重复。Java 中常见的实现有 HashSet(随机位置插入的 Set),LinkedHashSet(保持插入顺序的 Set)。TreeSet(保持容器中元素有序的 Set,默认为升序)。可以按照需要取用。
由于数据需要从小到大排序,我们一般使用 heap 堆来实现。堆是一棵树,其每个节点都有一个键值,且每个节点的键值都大于等于/小于等于其父亲的键值。我们这个题目使用小根堆,方便获取每次的最小值。
选定好了数据结构,按照题目,具体实现代码如下,供参考。
通过代码
复制代码
总结
上述算法的时间复杂度是 O(log n), 空间复杂度是 O(n)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/1611f87a84baaa4ea8ff0b13f】。文章转载请联系作者。
评论