Leetcode --- 丑数问题

简介: Leetcode --- 丑数问题

1.丑数(263 - 易)



题目描述:给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。


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


示例 :

输入:n = 6
输出:true
解释:6 = 2 × 3
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。


思路:数学问题:依次使用所给质因数缩小给定值,最后给定值为1,即为丑数。注:0和负数不是丑数。


代码实现:

public boolean isUgly(int n) {
    if (n <= 0) return false;
    int[] nums = {5, 3, 2};
    for (int num : nums) {
        while (n % num == 0) {
            n /= num;
        }
    }
    return n == 1;
}


2.丑数II(264 - 中)



题目描述:给你一个整数 n ,请你找出并返回第 n丑数


示例 :

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


思路:动态规划思想(空间换时间)


和1不同的是,本题是寻找第n个丑数,是自下向上。我们发现已有丑数都是基于之前的丑数乘上质因数。


这里使用三指针(代表第几个数的几倍,2,3,5倍),定义dp动态数组,其中,dp[i]:第i+1个丑数。状态转移方程:每次循环确定当前最小的一个丑数。


代码实现:

public int nthUglyNumber(int n) {
    int a = 0, b = 0, c = 0;
    int[] dp = new int[n];
    dp[0] = 1;
    for (int i = 1; i < n; ++i) {
        int n2 = dp[a] * 2, n3 = dp[b] * 3, n5 = dp[c] * 5;
        dp[i] = Math.min(n2, Math.min(n3, n5));
        if (dp[i] == n2) a++;
        if (dp[i] == n3) b++;
        if (dp[i] == n5) c++;
    }
    return dp[n - 1];
}


相关文章
【Leetcode -263.丑数 -268.丢失的数字】
【Leetcode -263.丑数 -268.丢失的数字】
30 0
leetcode每日一题 2021/4/10 263. 丑数
leetcode每日一题 2021/4/10 263. 丑数
47 0
LeetCode剑指 Offer 49. 丑数(dp/打表)
LeetCode剑指 Offer 49. 丑数(dp/打表)
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
110 0
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
【力扣】 丑数 来,和我上一节数学课吧~
【力扣】 丑数 来,和我上一节数学课吧~
103 0
【力扣】 丑数 来,和我上一节数学课吧~
【Day 01】力扣(LeetCode)每日一刷[506.相对名次][264.丑数][23.合并N个升序链表]
每日一刷[506.相对名次][264.丑数][23.合并N个升序链表]。
109 0
【Day 01】力扣(LeetCode)每日一刷[506.相对名次][264.丑数][23.合并N个升序链表]
【LeetCode剑指offer49】丑数(小顶堆或DP)
方法一:小顶堆 求前k大经常用到优先级队列,小顶堆,循环将符合要求的丑数加入小顶堆,取k次堆顶元素即可让堆顶为第k个丑数。而逐个加入丑数即加入2 x 2x2x、3 x 3x3x、5 x 5x5x进入集合(去重)即可。注意这里加入小顶堆的元素不能是int类型,否则会报错overflow(因为next = temp * factor后可能会越界):
135 1
【LeetCode剑指offer49】丑数(小顶堆或DP)
|
算法 前端开发 程序员
「LeetCode」剑指Offer-49丑数
「LeetCode」剑指Offer-49丑数
111 0
「LeetCode」剑指Offer-49丑数