题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
1)初始化三个队列,和存放结果的min变量
2)将1先插入队列1中
3 ) 令x为三个队列中的最小值
4)若x存在于:
队列1:将 x * 2、x * 3、x*5 分别放入三个队列,从 队列1中移除x
队列2:将 x * 3、x*5 分别放入 队列2,3中,从 队列2中移除x
队列3:将 x * 5放入 队列3,从队列3中移除x
5)重复步骤3~5,知道找到第index个元素
import java.util.ArrayDeque;
import java.util.Scanner;
public class GetUglyNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("input index:");
int index = scanner.nextInt();
System.out.println("The " + index + "th UglyNumber is:" + GetUglyNumber_Solution(index));
}
public static int GetUglyNumber_Solution(int index){
if(index < 1){
return 0;
}
ArrayDeque<Integer> deque1 = new ArrayDeque<Integer>();
ArrayDeque<Integer> deque2 = new ArrayDeque<Integer>();
ArrayDeque<Integer> deque3 = new ArrayDeque<Integer>();
int min = 0;
deque1.add(1);
for(int i=0;i<index;i++){
int minDeque1 = deque1.isEmpty() ? Integer.MAX_VALUE : deque1.peek();
int minDeque2 = deque2.isEmpty() ? Integer.MAX_VALUE : deque2.peek();
int minDeque3 = deque3.isEmpty() ? Integer.MAX_VALUE : deque3.peek();
min = Math.min(minDeque3, Math.min(minDeque1, minDeque2));
if(min == minDeque1){
deque1.add(2*min);
deque2.add(3*min);
deque3.add(5*min);
deque1.poll();
}
else if(min == minDeque2){
deque2.add(3*min);
deque3.add(5*min);
deque2.poll();
}
else{
deque3.add(5*min);
deque3.poll();
}
}
return min;
}
}