算法思想
三路归并,声明三个指针i,j,k,3个指针分别指向的3个子数组(2 3 5)中的最小值,一次往后排;
这道题容易想到把2,3,5依次往后排,然后输出结果就可以了,但是容易忽略14的情况,14即使2的倍数也是7的倍数,
所以这道题难得是想到2 * a[i], 3 * a[j], 5 * a[k],用2,3,5乘以数组里的丑数就可以解决14的问题
为什么错误代码不可以
错误代码是不断的求2,3,5的倍数,依次往后排,但是会出现其他质因子的情况,比如说14即是2的倍数优势7的倍数,就会出现错误了
而正确代码会自动忽略7的倍数,而只有6,8
java正确代码
class Solution {
public int getUglyNumber(int n) {
int[] q = new int[n];
q[0] = 1;
int i = 0, j = 0, k = 0;
for(int s = 1; s < n; s ++)
{
int t = Math.min(Math.min(2 * q[i], 3 * q[j]), 5 * q[k]);
q[s] = t;
if(t == 2 * q[i]) i ++;
if(t == 3 * q[j]) j ++;
if(t == 5 * q[k]) k ++;
}
return q[n - 1];
}
}
错误代码
class Solution {
public int getUglyNumber(int n) {
int[] q = new int[n + 10];
q[0] = 1;
int i = 1, j = 1, k = 1;
for(int s = 1; s < n; s ++)
{
int t = Math.min(Math.min(2 * i, 3 * j), 5 * k);
q[s] = t;
if(i * 2 == t) i ++;
if(j * 3 == t) j ++;
if(k * 5 == t) k ++;
}
return q[n - 1];
}
}