题目:Ugly Number II
Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number.
One:利用2、3、5之间的乘积值的大小比较。
public class Solution {
public int nthUglyNumber(int n) {
int[] uglyNumbers = new int[n];
uglyNumbers[0] = 1;
int index2 = 0;
int index3 = 0;
int index5 = 0;
int counter = 1;
while(counter < n){
int min = minOfThree(uglyNumbers[index2]*2,uglyNumbers[index3]*3,uglyNumbers[index5]*5);
if(min == uglyNumbers[index2]*2){
index2++;
}
if(min == uglyNumbers[index3]*3){
index3++;
}
if(min == uglyNumbers[index5]*5){
index5++;
}
uglyNumbers[counter] = min;
counter++;
}
return uglyNumbers[n-1];
}
private int minOfThree(int x,int y,int z){
return Math.min(z,Math.min(x,y));
}
}
Two:进一步简化
public class Solution {
public int nthUglyNumber(int n) {
int[] uglyNumbers = new int[n];
uglyNumbers[0] = 1;
int index2 = 0;
int index3 = 0;
int index5 = 0;
int counter = 1;
while(counter < n){
int min = Math.min(uglyNumbers[index5]*5,Math.min(uglyNumbers[index2]*2,uglyNumbers[index3]*3));
if(min == uglyNumbers[index2]*2)index2++;
if(min == uglyNumbers[index3]*3)index3++;
if(min == uglyNumbers[index5]*5)index5++;
uglyNumbers[counter] = min;
counter++;
}
return uglyNumbers[n-1];
}
}
Three:利用坐标来操作
public class Solution {
public int nthUglyNumber(int n) {
int[] uglyNumbers = new int[n];
uglyNumbers[0] = 1;
int index2 = 0;
int index3 = 0;
int index5 = 0;
int p = 1;
while(p < n){
uglyNumbers[p] = Math.min(uglyNumbers[index5]*5,Math.min(uglyNumbers[index2]*2,uglyNumbers[index3]*3));
if(uglyNumbers[p] >= uglyNumbers[index2]*2)index2++;
if(uglyNumbers[p] >= uglyNumbers[index3]*3)index3++;
if(uglyNumbers[p] >= uglyNumbers[index5]*5)index5++;
p++;
}
return uglyNumbers[n-1];
}
}