2022-7-9 剑指offer-优先队列-hashmap
剑指 Offer 49. 丑数
难度中等
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
1 class Solution { 2 public int nthUglyNumber(int n) { 3 PriorityQueue<Integer> queue=new PriorityQueue<>(); 4 Set<Integer> set=new HashSet<>(); 5 if (n==1) return 1; 6 queue.offer(1); 7 set.add(1); 8 for (int i=0;i<n-1;i++){ 9 int temp=queue.poll(); 10 if (temp<Integer.MAX_VALUE/2&&!set.contains(temp*2)) { 11 queue.offer(temp*2); 12 set.add(temp*2); 13 } 14 if (temp<Integer.MAX_VALUE/3&&!set.contains(temp*3)) { 15 queue.offer(temp*3); 16 set.add(temp*3); 17 } 18 if (temp<Integer.MAX_VALUE/5&&!set.contains(temp*5)) { 19 queue.offer(temp*5); 20 set.add(temp*5); 21 } 22 23 } 24 return queue.poll(); 25 } 26 }
思路:丑数总是由丑数*2 *3 *5诞生的,可以用优先队列存储丑数,构造新的丑数,主要要用hashmap去重和int溢出