LeetCode264. Ugly Number II

来源:互联网 发布:淘宝账户管理在哪里找 编辑:程序博客网 时间:2024/06/04 23:20

题目链接:

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];    }};
0 0
原创粉丝点击