java丑数算法_LintCode Java算法练习(4)-----丑数II

题目:题目

1 = 2^0 * 3^0 * 5^0

2 = 2^1 * 3^0 * 5^0

3 = 2^0 * 3^1 *5^0

.

.

.

依次类推,这便是丑数

假设  uglyNumber = 2^i * 3^j * 5^k;

i,j,k这三个数哪一个变化,表明上一个数乘上了那个数字

我们声明一个新的数组arr来存储丑数,第一位丑数为1,即 arr[0] = 1

1 -----> i = 0, j = 0, k = 0

2 -----> i = 1, j = 0, k = 0   即在1基础上乘上2

3 ------> i = 0, j = 1, k = 0

4 ------> i = 2, j = 0, k = 0

.

.

.

在这里我们使用的是Math类的静态方法min来求下一个丑数中的最小丑数作为下一个丑数

代码如下:

int[] arr = new int[n];

arr[0] = 1;

int p2 = 0;  // i

int p3 = 0;  // j

int p5 = 0; // k

for (int i = 1; i < n; i++) {

arr[i] = Math.min(arr[p2] * 2, Math.min(arr[p3] * 3, arr[p5] * 5) );

if (arr[i] == arr[p2] * 2) {

p2++;  // 若这个丑数是上个丑数乘上了一个2 则i加1

}

if (arr[i] == arr[p3] * 3) {

p3++;

}

if (arr[i] == arr[p5] * 5) {

p5++;

}

}

return arr[n - 1];

这几天有点累,有点懈怠了,这种情绪必须得克服,这次的题目解法是来自九章算法网上的,我自己用的暴力解法hhh,有点垮 T_T,我希望通过这种方式能填补自己的不足,虽然算法接触的少,但是一切在于积累,相信自己!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值