掘金团队号上线,助你 Offer 临门! 点击 查看详情
题目
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
提示:
1 <= n <= 1690
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ug…
思路分析
- 这个题目题意好理解,但是写出简洁清晰代码比较难。各位可以自己尝试写一下。理清思路,找个每个最小的丑数,完成排序。
代码
public class DayCode {
public static void main(String[] args) {
int num = 6;
int ans = new DayCode().nthUglyNumber(num);
System.out.println("ans is " + ans);
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
* @param n
* @return
*/
public int nthUglyNumber(int n) {
int size = 1690;
int[] nums = new int[size];
nums[0] = 1;
int ugly = 0, i2 = 0, i3 = 0, i5 = 0;
for (int i = 1; i < size; i++ ) {
ugly = Math.min(Math.min(nums[i2] * 2, nums[i3] * 3), nums[i5] * 5);
nums[i] = ugly;
if (ugly == nums[i2] * 2) {
i2++;
}
if (ugly == nums[i3] * 3) {
i3++;
}
if (ugly == nums[i5] * 5) {
i5++;
}
}
return nums[n-1];
}
}
总结
- 今天的每日一题,和昨天的丑数形成呼应,比昨天的复杂一点,实践五毒神掌!这里的n = 1690条件很重要,我们可以直接用来初始化数组。
- 坚持每日一题,加油!