动态规划丑数二

class Solution {
    public int nthUglyNumber(int n) {
    	int ans[]=new int[n],count=1,index2=0,index3=0,index5=0;
    	ans[0]=1;
    	while(count<n) {
    		ans[count]=Math.min(2*ans[index2],Math.min(3*ans[index3],5*ans[index5]));
    		if(ans[count]==2*ans[index2])
    			index2++;
    		if(ans[count]==3*ans[index3])
    			index3++;
    		if(ans[count]==5*ans[index5])
    			index5++;
    		count++;
    	}
    	return ans[n-1];
    }
}
/*
@yayawxw
@DP
一个十分巧妙的动态规划问题
    1.我们将前面求得的丑数记录下来,后面的丑数就是前面的丑数*2,*3,*5
    2.但是问题来了,我怎么确定已知前面k-1个丑数,我怎么确定第k个丑数呢
    3.采取用三个指针的方法,index2,index3,index5
    4.index2指向的数字下一次永远*2,index3指向的数字下一次永远*3,index5指向的数字永远*5
    5.我们从2*index2 3*index3 5*index5选取最小的一个数字,作为第k个丑数
    6.如果第K个丑数==2*index2,也就是说前面0-index2个丑数*2不可能产生比第K个丑数更大的丑数了,所以index2++
    7.index3,index5同理
    8.返回第n个丑数
*/

猜你喜欢

转载自blog.csdn.net/cobracanary/article/details/88570616