简单java队列算法

 第一个输入的是数组,第二个输入的值是需要减的值,第三个是k次,这里表述的时候后面一句话有些难以理解,是用数组的任何一个值减去x,得到新的数组的情况 ,如示例【7,2,1】减去3,得到的情况就有【4,2,1】、【7,-1,1】、【7,2,-1】三种,因为k=2,所以还需要减一次,第二次再减得到的数组【2,2,1】、【7,-4,1】、【7,2,-4】这样数组最大值最小的是2,所以输出2.

一开始想法是需要把数组中最大的数找出来,然后减去值,循环找最大值然后减掉值,直到次数达到k次,每次把最大值减去,就能得到数组最大数尽可能小

简化,创建最大优先队列,然后弹出最大值,然后再插入

public int minMax (ArrayList<Integer> a, int k, int x){        
       
    //创建最大优先队列(大在头)         
PriorityQueue<Integer> queue1 = new PriorityQueue<>( (o1,o2) -> o2-o1);         
   //添加元素进入优先队列         
  for (int i:a){           
  queue1.add(i);   
      }         
  //k次最大值-x         
      for (int j=0;j<k;j++){     
                   
       int max = queue1.poll();            
       queue1.add(max-x);       
  }        
​​​​​​​        return queue1.poll();  
} 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值