剑指offer (34) 丑数

题目:只包含因子2,3,5的数成为 丑数

求从小到大第1500个丑数

通常我们把1当作第一个丑数

方法一:逐个判断每个整数是不是丑数

如何判断一个数是不是丑数? 根据定义,丑数只能被2,3,5整除,也就是说,这个数的因子中只能是2,3,5

我们不断用这个数除以2,3,5,直到最后,如果得到1,那么这个数就是丑数

bool IsUgly(int num)
{
    assert(num >= 0);
    while (num % 2 == 0) {
        num /= 2;
    }

    while (num % 3 == 0) {
        num /= 3;
    }

    while (num % 5 == 0) {
        num /= 5;
    }

    return (num == 1) ? true : false;
}

接下来,只需要按照顺序来判断每一个整数是不是丑数

方法二:

前面一种方法效率低,因为它需要对每个数都进行判断是不是丑数,对于非丑数,花费了许多时间

根据丑数的定义:丑数的因子只能有2,3,5,可以得知 较大丑数除以较小丑数的结果只能是2,3,5的乘积,即相除结果也是丑数

我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的

这种思路的关键在于怎样确保数组里面的丑数是排好序的

给定前k个丑数(U1,U2,U3,…,Uk),计算第k+1个丑数Uk+1

第k+1个丑数肯定是前面k个丑数中的某个数乘以2,3,5的一个结果,

在前k个丑数中,分别找到最小的丑数p2,p3,p5,使得p2*2>Uk;p3*3>Uk;p5*5>Uk,之后Uk+1=min(p2*2, p3*3, p5*5)

注意:因为当前丑数均排好序,所以下一次寻找p2,p3,p5并不需要从头开始,只需要从上一次的p2,p3,p5开始即可

long long KthUgly(int kth)
{
    assert(kth >= 1);
    std::vector<long long> ugly(kth, 0);
    int index2 = 0;
    int index3 = 0;
    int index5 = 0;

    ugly.at(0) = 1;
    int lastIndex = 0;
    while (lastIndex + 1 != kth) {
        while (ugly.at(index2) * 2 <= ugly.at(lastIndex)) {
            ++index2;
        }

        while (ugly.at(index3) * 3 <= ugly.at(lastIndex)) {
            ++index3;
        }

        while (ugly.at(index5) * 5 <= ugly.at(lastIndex)) {
            ++index5;
        }

        long long min = std::min(std::min(ugly.at(index2) * 2, ugly.at(index3) * 3), ugly.at(index5) * 5);
        ++lastIndex;
        ugly.at(lastIndex) = min;
    }
    return ugly.at(lastIndex);
}

剑指offer (34) 丑数

时间: 2024-08-26 00:48:19

剑指offer (34) 丑数的相关文章

剑指OFFER之丑数(九度OJ1214)

题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 3 样例输出: 3 解题思路: 最简单的思路是,从1到大数,每个数都检测一遍是否是丑数,检测方法可以考虑 int ugly(int number){ if(number%2 == 0

剑指offer——51丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 1 //使用遍历判断的方法 2 class Solution01 { 3 public: 4 int GetUglyNumber_Solution(int index) { 5 if (index < 1)return 0; 6 int cnt = 0; 7 for (int i = 1; cnt <

【剑指Offer】丑数

问题描述 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 算法分析 每个位置上的丑数都是某个丑数乘上2或3或5的结果,看如下示例: 第1个丑数是 1, 第2个丑数是 1 * 2 = 2, 第1个丑数*2 第3个丑数是 1 * 3 = 3, 第1个丑数*3 第4个丑数是 2 * 2 = 4, 第2个丑数*2 第5个丑数是 1 * 5 = 5, 第1个丑数*5 第6个丑

《剑指offer》丑数

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不

剑指OFFER之丑数

题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 3 样例输出: 3 Code: #include <iostream> using namespace std; int minVal(int a,int b,int c

剑指offer 34_丑数

丑数:只有2 3 5 这三个因子的数,求前(第)1500个.习惯上我们把1当作第一个丑数 例如 6, 8是丑数.14不是. #include <stdio.h> int Min(int x,int y, int z){ int min = (x <= y) ? x : y; return min = (z <= min) ? z : min; } int GetUglyNumber(int index){ if(index <= 0){ return 0; } int* ug

《剑指offer》---丑数

本文算法使用python3实现 1. 问题1 1.1 题目描述: ??把只包含因子2.3和5的数称作丑数(Ugly Number).判断一个数是否是丑数. ??时间限制:1s:空间限制:32768K 1.2 思路描述: ??大致思路:将该数依次除以 $ 2,3,5 $ ,若最后商为 $ 1 $ 则是丑数,否则,不是丑数. 1.3 程序代码: class Solution: def isUgly(self, num): '''判断num是否是丑数''' if num <= 0: return Fa

[剑指offer] 33. 丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数.  leetcode原题,题解链接 class Solution { public: int GetUglyNumber_Solution(int index) { if (index < 7) return index; vector<int> res(index); res[0] = 1; in

剑指offer:丑数

题目描述把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. # -*- coding: utf-8 -*- # @Time : 2019-07-11 23:24 # @Author : Jayce Wong # @ProjectName : job # @FileName : getUglyNumber.py # @Blog : https://blog.51cto