题目:Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number, and n does not exceed 1690.
解题思路:动态规划解题。设v_2,v_3,v_5, v_2是dp数组中的某一个数而且v_2是dp数组中乘以2后大于dp[i-1]的最小元素; v_3是dp数组中的某一个数而且v_3是dp数组中乘以3后大于dp[i-1]的最小元素; v_5是dp数组中的某一个数而且v_5是dp数组中乘以5后大于dp[i-1]的最小元素,那么,dp[i] = min(v_2,v_3,v_5);时间复杂度和空间复杂度都为O(n),
代码:
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n);
int v =0, v_2 = 2, v_3 = 3, v_5 = 5;
int index_2 = 0 ,index_3 = 0 ,index_5 = 0;
dp[0] = 1;
for(int i = 1; i != n; ++i){
v = min(v_2,min(v_3,v_5));
dp[i]=v;
if(v==v_2){++index_2; v_2 = dp[index_2]*2;}
if(v==v_3){++index_3; v_3 = dp[index_3]*3;}
if(v==v_5){++index_5; v_5 = dp[index_5]*5;}
}
return dp[n-1];
}
};