day 5

  //使用优先级队列来做这道题,丑数是能够被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;
          }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值