Queue<Module> q = new PriorityQueue<>(compare);
peek() // 返回队首元素 poll() // 返回队首元素,且队首元素出列 offer() // 向队列中添加元素 size() // 返回队列元素的个数 isEmpty() // 判断队列是否为空
Queue<Integer> q = new PriorityQueue<>(); q.offer(1); q.offer(3); q.offer(2); while(!q.isEmpty()) { System.out.print(q.poll()+" "); }
//自定义比较器,降序排列 static Comparator<Integer> cmp = new Comparator<Integer>() { public int compare(Integer e1, Integer e2) { return e2 - e1; } };此时调用如下代码输出的就是3 2 1,变成了降序排列。
Queue<Integer> p= new PriorityQueue<>(cmp); p.offer(1); p.offer(3); p.offer(2); while(!p.isEmpty()) { System.out.print(p.poll()+" "); }
Comparator<Object> cmp = new Comparator<Object>() { public int compare(Object o1, Object o2) { //升序 return o1-o2; //降序 return o2-o1; } };
class User{ int id; int age; public User(int id,int age){ this.id=id; this.age=age; } }
//自定义比较类,这里按照id从小到大升序排列 static Comparator<User> user=new Comparator<User>() { public int compare(User o1, User o2) { return o1.id-o2.id; } };
Queue<User> q=new PriorityQueue<>(user); User n1=new User(1, 2); User n2=new User(3, 5); User n3=new User(2, 3); q.offer(n1); q.offer(n2); q.offer(n3); User n; while(!q.isEmpty()) { n=q.poll(); System.out.println("id: "+n.id+" age:" +n.age); }代码的输出为:
id: 1 age:2 id: 2 age:3 id: 3 age:5效果显而易见
Leetcode第502. IPO题就是一道典型的贪心算法x优先级队列的题目
假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。 给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。 最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。 总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。 答案保证在 32 位有符号整数范围内。 示例 1: 输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1] 输出:4 解释: 由于你的初始资本为 0,你仅可以从 0 号项目开始。 在完成后,你将获得 1 的利润,你的总资本将变为 1。 此时你可以选择开始 1 号或 2 号项目。 由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。 因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。 示例 2: 输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2] 输出:6
class Module { public Module(int profits, int capital) { this.profits = profits; this.capital = capital; } int profits; int capital; }
Module[] profitsCaptial=new Module[profits.length]; for(int i=0;i<profits.length;i++){ profitsCaptial[i]=new Module(profits[i],capital[i]); } Arrays.sort(profitsCaptial,new SortByCaptial());排列的函数如下:
public static class SortByCaptial implements Comparator<Module> { @Override public int compare(Module o1, Module o2) { return o1.capital-o2.capital; } }
int count = 1; Queue<Module> q = new PriorityQueue<>(compare); int i = 0; while (count <= k) { while ( i < profits.length && w >= profitsCaptial[i].capital) { q.offer(new Module(profitsCaptial[i].profits,profitsCaptial[i].capital)); i++; } if (q.isEmpty()) return w; Module n = q.poll(); w += n.profits; count++; }