5350. 将整数按权重排序

news/2024/5/19 5:30:40 标签: java, 排序算法, 堆排序, 数据结构

5350. 将整数按权重排序

topK的问题,可以考虑用堆来维护,比如说这个题,维护一个大小为k的最大堆(当然最大是自定义排序后的最大),那么在堆中的元素就是从小到大的元素。因为是大根堆,堆顶元素就是堆中的topK;

元素入堆时:

  • 如果元素入堆时,加入元素比堆顶小,就更换堆顶元素;
  • 否则无操作

通过维护一个堆(java中用优先队列实现),那么堆顶元素就是我们要的topK了。

优化:

另外就本题来说,每一个数的权值都是一定的,如果之前算过了,就直接从map中获得

java">class Solution {
    public int getKth(int lo, int hi, int k) {
    	//大根堆
    	PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)-> {
    		if(o1[1] == o2[1]) {	//如果权重相同,按数字本身大小排序
    			return o2[0] - o1[0];	
    		}
    		return o2[1] - o1[1];
    	});
    	HashMap<Integer, Integer> hs = new HashMap<>();
    	for (int i = lo; i <= hi; i++) {
			int temp = i;
			int count = 0;
			while(temp != 1) {
				if(hs.containsKey(temp)) {	//如果算过,用缓存中的权值
					count = hs.get(temp) + count;
					break;
				}else {
					if(temp%2 == 0) {
						temp >>= 1;
					}else {
						temp = 3*temp +1;
					}
					count++;
				}
			}
			if(!hs.containsKey(i)) {	//算完了,就放入缓存
				hs.put(i, count);
			}
			int[] arr = new int[2];
			arr[0] = i;
			arr[1] = count;
			if(pq.size() < k) {	//维护一个大小为k的最大堆
				pq.offer(arr);
			}else {
				int[] top = pq.peek();
				if(arr[1] < top[1] || (arr[1] == top[1] && arr[0] < top[0])) {
					pq.poll();
					pq.offer(arr);
				}
			}
		}
    	return pq.poll()[0];
    }
}

http://www.niftyadmin.cn/n/1690631.html

相关文章

C语言各类型所占字节数

&#xff08;1&#xff09;struct结构体变量大小等于结构体中的各个成员变量所占内存大小总和&#xff0c;union共用体变量大小等于共用体结构中占用内存最大的成员的内存大小&#xff1b; 联合体中占用内存空间最大的字段加上填充字节&#xff08;对齐字节后所需字节数&#x…

面试题09. 用两个栈实现队列

面试题09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 一个队列中的数两…

利用栈计算中缀表达式

给定一个中缀表达式&#xff0c;如果合法那么求出它的值&#xff0c;否则返回错误信息。 首先要将中缀表达式转换为后缀表达式&#xff08;逆波兰表达式&#xff09; 这里的输入限定为&#xff1a;除操作符外均为小写字母&#xff0c;假设输入合法的中缀表达式思想&#xff1a;…

字符串匹配(KMP)

仅作个人总结&#xff0c;初学KMP不建议看本文 1.暴力匹配&#xff1a; 时间复杂度&#xff1a;O&#xff08;mn&#xff09; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String S sca…

二叉树的前中后序遍历的递归及非递归算法

144. 二叉树的前序遍历 1.递归 递归时间复杂度&#xff1a;O(N)&#xff0c;N为二叉树结点的个数 class Solution {List<Integer> res new LinkedList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root ! null){res.add(root.val);p…

回溯问题

回溯问题&#xff0c;大多数用到DFS搜索&#xff0c;注意进入递归后即进入下一层搜索&#xff0c;但是当前方法并没有执行完&#xff0c;需要回溯&#xff0c;再次尝试下一种可能性。对于数据范围不大&#xff0c;需要遍历搜索&#xff0c;而使用普通循环又过于繁琐或根本不可行…

质数判断区间质数统计

204. 计数质数 要求统计所有小于非负整数 n 的质数的数量。 解法1.质数判断 遍历每一个小于n的非负整数&#xff0c;判断是否是质数。时间复杂度O(nnn\sqrt{n}nn​)&#xff0c;超时 class Solution {public int countPrimes(int n) {int res 0;for (int i 2; i < n; …

编译原理文法作业

编译原理关于文法的作业&#xff0c;不是标准答案&#xff0c;仅供参考&#xff0c;如有错误&#xff0c;还请指出。 给出语言 L{an bm| m≥n≥2} 的文法 S−>aaBbbB−>aBb∣Bb∣ϵS->aaBbb\\B->aBb|Bb|\epsilon S−>aaBbbB−>aBb∣Bb∣ϵ 给出语言 L{an bm…