-
PriorityQueue
-
也就是说,heap.poll() 得到的是当前堆的最小值,并且会把这个值移出堆
-
set 的性质:集合的特性 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。 有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
-
利用 set 的互异性,去除重复的元素
class Solution {
public int nthUglyNumber(int n) {
int[] factors = {2, 3, 5}; //质因子
//使用set,来排除重复的元素
Set<Long> sl = new HashSet<Long>();
PriorityQueue<Long> heap = new PriorityQueue<Long>(); //优先队列,最小堆
sl.add(1L); //1特殊处理
heap.offer(1L);
int ugly = 0;
for (int i = 0; i < n; i ++) {
long cur = heap.poll();
ugly = (int) cur;
for (int factor : factors) {
//丑数乘以质因子得到的依然是丑数,加上利用性质,得到的是排序后的
long next = cur * factor;
//利用set的性质,去除重复的丑数
if (sl.add(next)) {
heap.offer(next);
}
}
}
return ugly;
}
}