dsasd
dsasd
dssdsdas
/**
解题思路:咋说呢?这种题就是看解析,首先动态规划,dp[n]代表第n+1个丑数
具体怎么想,看别人总结,已放到CSDN
*/
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n];
//边界值
dp[0] =1;
//三个指针指向0,分别对应着前一个丑数的下标
int a=0 , b=0 , c=0;
for(int i=1 ; i<n ; i++){
int na = dp[a]*2 , nb = dp[b]*3 , nc = dp[c]*5;
dp[i] = Math.min(Math.min(na,nb),nc);
if(dp[i] == na) a++;
if(dp[i] == nb) b++;
if(dp[i] == nc) c++;
}
return dp[n-1];
}
}
adas
dssdasd
dsaddddas
/**
解题思想:贪心算法
首先我们要根据不等式求得分成每一段的长度是多少,我们求导发现每一段的最优值应该为e≈2.7,而如果是整数,则优先选3其次2.
对于4,不能再分,所以我们要直到贪心算法不是精确解,一定要注意
*/
class Solution {
public int cuttingRope(int n) {
//首先每段的最优值为3.
if(n <= 3)
return n-1;
int div = 1000000007;
//n>3时进行分段,
long res = 1L;
//贪心算法,优先切三,其次切二
while(n>4){
res = res*3%div;
n-=3;
}
return (int)(res*n%div);
}
}
dsasd
dsadas
/**
解题思想: 递归
首先是数组长度如果只有一个或者没有,我们需要判断
1、找根节点,一定是区间的最后一个值
2、
*/
class Solution {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder , 0 , postorder.length-1);
}
private boolean recur(int[] postorder , int i , int j){
//递归头,树长<=1
if(i>=j) return true;
//接下来找左右子树的区间
int p = i;
while(postorder[p]<postorder[j]) p++;
int m = p;
//到此 m就是右子树节点的第一各节点
//接下来判断右子树是否都大于根节点
while(postorder[p]>postorder[j]) p++;
return p==j && recur(postorder , i , m-1) && recur(postorder , m , j-1);
}
}