• 【剑指offer】丑数


    把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

    leetcode上也有这道题。不过是判断一个数是否为丑数。貌似是我第二道解出来的leetcode,印象还蛮深的。用了递归。

    class Solution {
    public:
        bool isUgly(int num) {
            if (num<=0) return false;
            if (num==1) return true;
            if (num%2==0)
                isUgly(num/2);
            else if (num%3==0)
                isUgly(num/3);
            else if (num%5==0)
                isUgly(num/5);
            else
                return false;
        }
    };

    但是这道题是给出第N个丑数。所以如果每个数都判断是否为丑数,比较耗时。剑指offer里看过又忘记了==|||

    只记得用数组,根据已经有的丑数去计算,具体的记不清楚了。

    1是第一个丑数,第二个丑数由1* 2/3/5中产生,其中最小的既是下一个丑数。——2(接下来的丑数将包含两个2的因子max2+1)

    第二个丑数由2* 2/3/5还有上次的1*3/5中产生,最小的3既是下一个丑数。——3(接下来的丑数将包含两个3的因子max3+1)

    ·

    ·

    ·

    数组中第N个项既是第N个丑数。

    class Solution {
    public:
        int getMin(int max2,int max3,int max5){
        int min = max2<max3?max2:max3;
        return min<max5?min:max5;
    }
        int GetUglyNumber_Solution(int index) {
            int* Array=new int[index];
            Array[0]=1;
            int *max2 = Array;
            int *max3 = Array;
            int *max5 = Array;
            for(int i=1;i<index;i++){
                int min = getMin(*max2*2,*max3*3,*max5*5);
                Array[i] = min;
                while(*max2*2 <= Array[i])
                    ++max2;
                while(*max3*3 <= Array[i])
                    ++max3;
                while(*max5*5 <= Array[i])
                    ++max5;
                 
                 
            }
            return Array[index-1];
        }
    };
  • 相关阅读:
    PHP 错误:Warning: Cannot modify header information
    PHP截取中文字符串
    myeclipse 保存含中文的jsp失败,提示内容含有 ISO-8859-1 不支持的字符
    jquery ajax到servlet出现中文乱码(utf-8编码下)
    数据结构~动态存储管理(五)
    数据结构~树和二叉树(三)
    数据结构~线性表(二)
    数据结构~基础概念(一)
    每日一摘:串并-并串转换
    每日一摘:Verilog复位
  • 原文地址:https://www.cnblogs.com/LUO77/p/5642394.html
Copyright © 2020-2023  润新知