【剑指offer】丑数

题目描述

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

思路

首先题意上说只包含质因子2、3和5的数称作丑数,那么就说明一个丑数它一定是由另一个丑数乘以2或者乘以3或者乘以5得到。

所以我们就定义一个vector丑数数组,然后用2或3或5不断乘以这个数组,然后将得到的丑数再添加到数组中,注意添加的过程中要进行排序,即每次都将最小的丑数进行添加。

代码

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 7){  //因为1~6都是丑数
            return index;
        }
        vector<int> v;//用来存丑数
        v.push_back(1);
        //一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到
        int p2 = 0;//乘以2的丑数的下标
        int p3 = 0;//乘以3的丑数的下标
        int p5 = 0;//乘以5的丑数的下标
        int ans = 0;
        while(v.size() < index){
            //取最小是为了得到的丑数是从小到大排序的
            ans = min(v[p2]*2, min(v[p3]*3, v[p5]*5));
            //将得到的丑数压入vector
            v.push_back(ans);
            //如果得到的丑数是通过乘以2或3或5得到的,就将对应的下标往前移
            if(ans == v[p2]*2) p2++;
            if(ans == v[p3]*3) p3++;
            if(ans == v[p5]*5) p5++;
        }
        return ans;
    }
};

 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务