//使用优先级队列来做这道题,丑数是能够被2、3、5整除的数
//可借用优先级队列,定义一个count变量,也就是第n个丑数的n,
//当count大于n时,说明已执行到第n个丑数
public int function(int n){
int count=0;//执行次数
long result=1;//1是第一个丑数,result表示第n个丑数
Queue<Long>queue=new PriorityQueue<>();//定义一个优先级队列来存放
queue.add(result);
//每一个丑数,由于优先级队列能够将存放元素顺序排列,第一个弹出的元素为最小值
while (count<n){
result=queue.poll();
while(!queue.isEmpty()&&queue.peek()==result){
//如果优先级队列不为空的话,获取最小丑数元素后要把所有自身删掉,与其值相等的
//因此这里用的是while
//丑数也需要一并删除,防止result获得重复的丑数结果
queue.poll();
}
queue.add(result*2);//将每次的最小队列丑数分别*2 3 5放入最小队列中
queue.add(result*3);
queue.add(result*5);
count++;//执行完后要将count++,构成循环退出条件
}
return (int)result;//
}
//让数组1的每个值尽量比2大
public int[] advantageCount(int[] nums1, int[] nums2) {
//将nums1升序排序
Arrays.sort(nums1);//数组1升序排列
PriorityQueue<int[]>queue=new PriorityQueue<>((o1,o2)->o2[1]-o1[1]);
//通过数组的1下标的值进行比较
for (int i = 0; i <nums2.length ; i++) {
queue.offer(new int[]{i,nums2[i]});//将数组2的下标和值都记录在数组
}
int left=0;
int right=nums1.length-1;//双指针分别指向最大值和最小值
int []result=new int[nums2.length];
while (!queue.isEmpty()){
int []pair=queue.poll();//nums2的最大值及其下标
int index=pair[0];
int num=pair[1];
if (nums1[right]>num){
result[index]=nums1[right];
right--;//大于最大值则用最大值去比
}else{
result[index]=nums1[left];
left++;//小于的话则用最小值去比
}
}
return result;
}