学习记录
动态规划套路–知乎
树形dp:二叉树染色(昨天比赛遇到的,太难了呜呜,现在还没看懂,改天再回过头来看吧)
题目描述
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 :
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
方法
动态规划+三指针:
数组元素含义: dp[i]表示第i个丑数,三指针p2,p3,p5分别代表当前要与2/3/5相乘的数
递推关系式: dp[i] = min(dp[p2]*2,dp[p3]*3,dp[p5]*5)
初始值: dp[1] = 1,p2=p3=p5=1
代码
执行用时:3 ms, 在所有 Java 提交中击败了81.63%的用户
内存消耗:37.4 MB, 在所有 Java 提交中击败了73.41%的用户
class Solution {
public int nthUglyNumber(int n) {
int k = 1;
int[] dp = new int[n+1];
dp[1] = 1;
int p2=1,p3=1,p5=1;
while(k<n){
k++;
dp[k] = Math.min(dp[p2]*2,Math.min(dp[p3]*3,dp[p5]*5)); //递推关系
// System.out.println("k: "+k+" "+dp[k]+" "+p2+" "+p3+" "+p5+" ");
if(dp[k]==dp[p2]*2) p2++; //取最小值那个,指针后移
if(dp[k]==dp[p3]*3) p3++;
if(dp[k]==dp[p5]*5) p5++;
}
return dp[n];
}
}