自定义优先队列 比较器
import java.util.*;
public class Solution {
public int GetUglyNumber_Solution(int index) {
//自定义优先队列 比较器
PriorityQueue<int[]> que=new PriorityQueue<int[]>(
new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
//第一个代表数字 第二个代表该数字的最小质因子, 1作为初始化 需要执行2,3,5所以1的质因子需要比2,3,5都大。
//然后就是最小堆,每次选出最小的那个就是第n个丑数
//同时每次把该数字乘以2,3,5构造出的丑数放入最小堆
//原理就是 2*3 = 6 = 3*2 重复了 通过判断只能产生3*2 而 2的最小质因子为2 不能乘3 就避免了重复乘,
//只有质数能保证这样的性质
//如果不是质数 需要用set集合
que.offer(new int[]{1,6});
int[] nums = new int[2];
for(int i=0;i<index;i++){
nums = que.poll();
que.offer(new int[]{nums[0]*2,2});
if(nums[1]>2){
que.offer(new int[]{nums[0]*3,3});
if(nums[1]>3)
que.offer(new int[]{nums[0]*5,5});
}
}
return nums[0];
}
}


京公网安备 11010502036488号