思路
- 我们可以首先写出前几个丑数作为种子,比如 array = [1, 2, 3, 4, 5],这是前5个丑数,我们如何确定第6个呢? 第六个丑数,一定是
value2=min(array[i]∗2),value3=min(array[i]∗3),value5=min(array[i]∗5)
最小的一个,我们可以找到这个数。同时记住取得
value2,value3,value5
时候的位置i分别为
temp2,temp3,temp5
,下一次在这个基础上继续往下找。
代码
public int nthUglyNumber(int n) {
List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
int temp2 = 1;
int value2 = 0;
int temp3 = 1;
int value3 = 0;
int temp5 = 1;
int value5 = 0;
if (n > list.size()) {
while (list.size() != n) {
for (; temp2 < list.size(); temp2++) {
value2 = list.get(temp2) * 2;
if (value2 > list.get(list.size() - 1)) {
break;
}
}
for (; temp3 < list.size(); temp3++) {
value3 = list.get(temp3) * 3;
if (value3 > list.get(list.size() - 1)) {
break;
}
}
for (; temp5 < list.size(); temp5++) {
value5 = list.get(temp5) * 5;
if (value5 > list.get(list.size() - 1)) {
break;
}
}
list.add(minist(value2,value3,value5));
}
}
return list.get(n-1);
}
public int minist(int a, int b, int c) {
if (a - b <= 0&& a - c <= 0) {
return a;
}else if (b - a <= 0 && b - c <= 0) {
return b;
}else{
return c;
}
}
public int minist2 (int a, int b, int c) {
int min = a;
if (min > b) {
min = b;
}
if (min > c) {
min = c;
}
return min;
}
参考