当前位置: 首页 > news >正文

有序矩阵中第K小元素[优先队列PriorityQueue]

优先队列PriorityQueue

  • 前言
  • 一、有序矩阵中第K个最小元素
  • 二、PriorityQueue
  • 总结
  • 参考文献

前言

如果遇到求最短路径相关问题,而每走一步面临着n个选择方案,如果直接遍历O(n)不是想要的复杂度,则在N个元素中以O(logN)定位元素,非PriorityQueue莫属。

一、有序矩阵中第K个最小元素

在这里插入图片描述

二、PriorityQueue

package everyday.medium;

import java.util.Comparator;
import java.util.PriorityQueue;

// 有序矩阵中第K个最小元素。
public class KthSmallest {
    /*
    行有序/列有序,但不同行不同列之间没有关系。
    每个坐标可往下/右走,通过优先队列拿到最小坐标即可。
     */
    public int kthSmallest(int[][] matrix, int k) {
        int m = matrix.length;

        PriorityQueue<int[]> que = new PriorityQueue<>(Comparator.comparingInt(p -> p[2]));
        // bug2:修改数组标记后,原数据就不再了,需要将其记录。
        que.add(new int[]{0, 0, matrix[0][0]});
        // 标记
        matrix[0][0] = 1 << 31;

        while (!que.isEmpty()) {
            int[] pos = que.poll();
            int i = pos[0], j = pos[1];
            // 先判定是否寻找到了第K小元素。
            if (--k == 0) return pos[2];
            // bug1:元素入队列了之后需要标记,防止再入队列。
            if (i < m - 1 && matrix[i + 1][j] != 1 << 31) {
                que.add(new int[]{i + 1, j, matrix[i + 1][j]});
                // 标记
                matrix[i + 1][j] = 1 << 31;
            }
            if (j < m - 1 && matrix[i][j + 1] != 1 << 31) {
                que.add(new int[]{pos[0], pos[1] + 1, matrix[i][j + 1]});
                // 标记
                matrix[i][j + 1] = 1 << 31;
            }
        }
        return -1;
    }
}

总结

1)优先队列,以O(logN)的时间寻找元素,是求局部最小/最大的第时间复杂度方法。

参考文献

[1] LeetCode 有序矩阵中第K小元素

相关文章:

  • 闲谈JVM(一):浅析JVM Heap参数配置
  • 商城小程序系统,商城源码
  • 元宇宙电商-NFG系统带你布局数字藏品领域
  • statsD学习笔记
  • 坠落的蚂蚁(暑假每日一题 40)
  • TV蓝牙无法被搜索问题解决记录:REQUEST_DISCOVERABLE ActivityNotFoundException
  • 【JavaScript 逆向】猿人学 web 第六题:回溯
  • 最牛逼的 Java 日志框架,性能无敌,横扫所有对手
  • CREO:CREO软件之装配设计界面的简介、装配图设计流程、案例应用(图文教程)之详细攻略
  • 【赛码网刷题】动态规划之上台阶
  • Java 的开发效率究竟比 C++ 高在哪里?
  • python random应用实例 从可选池随机选取指定个数的元素并随机排序
  • 【Java成王之路】EE初阶第二十二篇 博客系统(页面设计)
  • 编译mtd-utils(使用uclibc编译)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • ES6指北【2】—— 箭头函数
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 3.7、@ResponseBody 和 @RestController
  • Android框架之Volley
  • CentOS7 安装JDK
  • EOS是什么
  • HTTP那些事
  • linux安装openssl、swoole等扩展的具体步骤
  • nodejs:开发并发布一个nodejs包
  • Odoo domain写法及运用
  • PHP CLI应用的调试原理
  • 阿里云购买磁盘后挂载
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 强力优化Rancher k8s中国区的使用体验
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 怎么把视频里的音乐提取出来
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 函数计算新功能-----支持C#函数
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{}和${}的区别?
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (42)STM32——LCD显示屏实验笔记
  • (C++17) std算法之执行策略 execution
  • (Python第六天)文件处理
  • (多级缓存)缓存同步
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (篇九)MySQL常用内置函数
  • (区间dp) (经典例题) 石子合并
  • (三)mysql_MYSQL(三)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • ../depcomp: line 571: exec: g++: not found
  • ./configure,make,make install的作用
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net mvc部分视图
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法