当前位置: 首页 > 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
  • gitlab-ci配置详解(一)
  • happypack两次报错的问题
  • JDK 6和JDK 7中的substring()方法
  • LeetCode29.两数相除 JavaScript
  • leetcode386. Lexicographical Numbers
  • Nodejs和JavaWeb协助开发
  • Protobuf3语言指南
  • Python学习笔记 字符串拼接
  • vue学习系列(二)vue-cli
  • 安卓应用性能调试和优化经验分享
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 对象引论
  • 记一次和乔布斯合作最难忘的经历
  • 精彩代码 vue.js
  • 前端js -- this指向总结。
  • 深度学习中的信息论知识详解
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ![CDATA[ ]] 是什么东东
  • (003)SlickEdit Unity的补全
  • (Forward) Music Player: From UI Proposal to Code
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (南京观海微电子)——I3C协议介绍
  • (转)http协议
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • [ linux ] linux 命令英文全称及解释
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [DAX] MAX函数 | MAXX函数
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HDU3710]Battle over Cities
  • [Linux](15)线程基础,线程控制,线程的互斥与同步
  • [Loadrunner参数化]一个文件输两列参数的取值
  • [NOIP2013]华容道