LeetCode264. Ugly Number II

题目链接:

https://leetcode.com/problems/ugly-number-ii/

题目描述:

找出第n个丑数。
丑数:1是一个特殊的丑数,其次只含有2,3,5质因数的数被定义为丑数。

题目分析:

诶,自己做没做出来。

http://www.geeksforgeeks.org/ugly-numbers/
可以参考这个很详细哒。

根据动态规划的思想,当前的丑数肯定是由之前某个丑数乘2或乘3或乘4得到。这样就能得到一个生成链,麻烦的是这个生产链得是有序的。用三个指针idx2,idx3,idx4来保证有序。
且我们要保证每次迭代选择的都是最小的丑数。
factor2表示2*之前的某个丑数,idx2表示之前那个丑数的下标。当factor2被更新了,那么idx2指针也要前进一位。

代码:

class Solution {
public:
    int minAmongThree(int a,int b,int c){
        int minNum=a<b?a:b;
       return minNum<c?minNum:c;
    }
    int nthUglyNumber(int n) {
        vector<int> uglyNums(n,0);
        uglyNums[0]=1;
        int idx2,idx3,idx5;
        idx2=idx3=idx5=0;
        int factor2=1,factor3=1,factor5=1;
        for(int i=0;i<n;i++){
            uglyNums[i]=minAmongThree(factor2,factor3,factor5);
            if(factor2==uglyNums[i]){
                factor2=2*uglyNums[idx2++];
            }
            if(factor3==uglyNums[i]){
                factor3=3*uglyNums[idx3++];
            }
            if(factor5==uglyNums[i]){
                factor5=5*uglyNums[idx5++];
            }
        }
        return uglyNums[n-1];
    }
};

你可能感兴趣的:(LeetCode,动态规划,双指针)