17.4.25

WRONG ANSWERS

public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int len = primes.length;
int[] pw = new int[len];//zhizhen
for(int p:pw)
p = 0;
int[] uN = new int[n];//存丑数
for(int u: uN)
u = 0;
//第K个丑数和前K-1个有关
if(n == 1)
return 1;
for (int i = 1; i < n; i++) {
int min = 0;
int[] uNbx = new int[len]; //丑数备选
for (int j = 0; j < len; j++)
uNbx[j] = pw[j] * primes[j];
for(int j = 0; j < len - 1; j++) {//找备选数组最小值
if(uNbx[j] > uNbx[j + 1])
min = uNbx[j + 1];
if (uNbx[j] <= uNbx[j + 1])
min = uNbx[j];
}
for(int j = 0; j < len; j++)
if(min == uNbx[j])
pw[j]++;
}
return uN[n - 1];
}
}
——————————————————————————————————————————————————————————————

 

public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int len = primes.length;
int[] pw = new int[len];//zhizhen
// for(int p:pw)
// p = 0;
int[] uN = new int[n];//存丑数
// for(int u: uN)
// u = 0;
uN[0] = 1;
//第K个丑数和前K-1个有关
if (n == 1)
return uN[0];
for (int i = 0; i < n; i++) {
uN[i] = Integer.MAX_VALUE - 100;
for (int j = 0; j < len; j++)
uN[i] = Math.min(uN[i], uN[pw[j]] * primes[j]);
for (int j = 0; j < len; j++) //找备选数组最小值
if(uN[i] == uN[pw[j]] * primes[j])
pw[j]++;
}
return uN[n - 1];
}
}

________________________________________

public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int len = primes.length;
int[] pw = new int[len];//zhizhen
// for(int p:pw)
// p = 0;
int[] uN = new int[n];//存丑数
// for(int u: uN)
// u = 0;
uN[0] = 1;
//第K个丑数和前K-1个有关
if (n == 1)
return uN[0];
for (int i = 1; i < n; i++) {
uN[i] = Integer.MAX_VALUE - 100;
for (int j = 0; j < len; j++)
uN[i] = Math.min(uN[i], uN[pw[j]] * primes[j]);
for (int j = 0; j < len; j++) //找备选数组最小值
if(uN[i] == uN[pw[j]] * primes[j])
pw[j]++;
}
return uN[n - 1];
}
}

 ————————————————————————————————————————————————————————————————

public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int[] ugly = new int[n];
int[] idx = new int[primes.length];
int[] val = new int[primes.length];
Arrays.fill(val, 1);

int next = 1;
for (int i = 0; i < n; i++) {
ugly[i] = next;

next = Integer.MAX_VALUE;
for (int j = 0; j < primes.length; j++) {
//skip duplicate and avoid extra multiplication
if (val[j] == ugly[i]) val[j] = ugly[idx[j]++] * primes[j];
//find next ugly number
next = Math.min(next, val[j]);
}
}

return ugly[n - 1];
}
}

方法二 更快空间更大

 
 
posted on 2017-04-25 21:28  bloomingFlower  阅读(147)  评论(0编辑  收藏  举报