题解 | #丑数#

丑数

http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

第七十二题
维护三个指针,分别表示 最后一次*235的值的位置
原理看答案的图思考一下 我表述不出来QAQ
大致思想就是每次找最后乘235的最后一个,并且乘的东西,是在ans中依次找下去的,用过了,就找ans后一个。
ans中依次存储的都是最小的,再依次比较最小的乘235谁大谁小。
......看答案解析吧 -> _ ->

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        // 丑数的定义为只由235的乘积组成
        
        // i用来维护和更新最新的ans
        // num235从头开始计算,记录乘235的最后一次 所在的位置
        // 每次只要从三个索引的位置 找到*2或3或5 中最小的 并更新num235
        
        // 1 0 0    2
        // 1 1 0    3
        // 2 1 0    4
        // 2 1 1    5
        // 3 2 1    6
        // 下一次找 就是从ans[3]*2,ans[2]*3,ans[1]*5 找最小值
        // ans里面都是最小的了,再往后肯定更大
        // 去看看讲解的演示吧QAQ
        int num2=0,num3=0,num5=0;
        int*ans=new int[index];
        ans[0]=1;
        for(int i=1;i<index;i++)
        {
            ans[i]=min(min(ans[num2]*2,ans[num3]*3),ans[num5]*5);
            if(ans[i] == ans[num2]*2)
                num2++;
            if(ans[i]==ans[num3]*3)
                num3++;
            if(ans[i]==ans[num5]*5)
                num5++;
//             cout<<num2<<num3<<num5<<endl;
        }
    return ans[index-1];
    }
};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

昨天 14:22
门头沟学院 Java
大厂 测开 24*16离家近的事业编(大概只有大厂的1/4) 硕士
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务