Bootstrap

LeetCode每日一题: 264. 丑数 II

264. 丑数 II

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给你一个整数 n ,请你找出并返回第 n丑数

丑数 就是只包含质因数 23 和/或 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

提示:

  • 1 <= n <= 1690

思路

打表!1690个数,不打表不是血亏?hhh。
嘛,如果要正常算法思维做题的话,自然是三指针,dp数组动态规划的思路比较方便了。题解也有用堆的思路吧,倒也可以多看看。
下面就是比较无聊的东西了,文字表达能力有限,没有图还是太难写,想看就看吧,一时兴起,写完才发现发现写的都是啥玩意……。

动态规划自然是先想中间。我找到了一个丑数,那么下一个丑数怎么找?肯定是比前一个丑数大一点的值。然后丑数x又必定是2,3,5这三个数中某个数的倍数,那如果丑数x除以2或3或5之后呢?那依然还是丑数,因为丑数只能是2,3,5的倍数!如果丑数的因子中有其他的数,就不符合丑数的定义了!
也就是说,只有让一个丑数去乘以2,3,5,我们才能得到一个新的丑数!
那么理解了这个问题,就好办了,既然只能用丑数乘2,3,5得到新的丑数,那么找下一个丑数时,我们只需要从现有的丑数中找到一个数乘上2,3,5,使它恰好比现在最大的丑数大一点点就行了。

那问题来了,怎么找呢?

先讲答案吧,我们可以搞三个指针,记一下数组某个位置乘以2或3或5的值(三个指针指向不一定相同的位置,分别乘2,3,5),将这三者中最小的那个值放在数组最后,再让指针偏移一下就行了。这样做首先保证下一个丑数肯定是刚好大于当前数组最大值的,如果指针指向的数乘2或3或5不是下一个丑数的话,指针就不会偏移了。然后指针++之后下一个数肯定是大一点的,因为数组是升序的。这样子,每次找下一个丑数的时候&#

;