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

LintCode第401题-排序矩阵中的从小到大第k个数

描述

在一个排序矩阵中找从小到大的第 k 个整数。

排序矩阵的定义为:每一行递增,每一列也递增。

样例 1:

输入:
[[1 ,5 ,7],[3 ,7 ,8],[4 ,8 ,9],
]
k = 4
输出: 5

样例 2:

输入: 
[[1, 2],[3, 4]
]
k = 3
输出: 3

挑战

时间复杂度 O(klogn), n 是矩阵的宽度和高度的最大值

思路:小顶堆(k 路归并法)

易错点:

需要每次都从当前候选里挑出最小的那个再扩展,而不是先随便收集一些数再统一排序

代码如下:

import java.util.*;

public class Solution {

    /**

     * @param matrix: a matrix of integers

     * @param k: An integer

     * @return: the kth smallest number in the matrix

     */

    public int kthSmallest(int[][] matrix, int k) {

       

        if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {

            return 0;

        }

        int n = matrix.length;

        int m = matrix[0].length;

        int smallestNumber = 0; // 最后返回的结果

        int calculateNum = 1;   // 计数器:表示当前弹出的元素个数

        boolean visited[][] = new boolean[n][m];

        // 先进入一个节点 即0,0位置节点

        visited[0][0] = true;

        // 小顶堆:每次取出全局最小的元素

        PriorityQueue<int[]> integerQueue = new PriorityQueue<>(

            (a, b) ->Integer.compare(matrix[a[0]][a[1]],matrix[b[0]][b[1]])

        );

        // 把 (0,0) 放进堆

        integerQueue.offer(new int[]{0, 0});

        // 依次弹出k次,第k次弹出的就是答案

        for (int t = 0; t < k; t++) {

            int[] cur = integerQueue.poll();

            int i = cur[0];

            int j = cur[1];

            smallestNumber = matrix[i][j];

            // 遍历其右边的第一个元素和下面的第一个元素

            if (i + 1 < n && visited[i + 1][j] == false) {

                integerQueue.offer(new int[]{i + 1, j, matrix[i + 1][j]});

                visited[i + 1][j] = true;

                calculateNum++;

            }

            if (j + 1 < m && visited[i][j + 1] == false) {

                integerQueue.offer(new int[]{i, j + 1, matrix[i][j + 1]});

                visited[i][j + 1] = true;

                calculateNum++;

            }

        }

        return smallestNumber;

    }

}

http://www.dtcms.com/a/361458.html

相关文章:

  • ESP32驱动数字麦克风INMP441
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘tox’问题
  • 代码随想录刷题Day47
  • 深度学习篇---ShuffleNet网络结构
  • NextJs基础
  • 《LINUX系统编程》笔记p7
  • 1.数值分析——概述、误差
  • 【数据可视化-105】Pyecharts主题组件:让你的图表瞬间高大上
  • c++关键字
  • 首屏优化讲解
  • JavaEE 进阶第一期:开启前端入门之旅(上)
  • pip不是内部或外部命令的问题怎么解决?
  • 【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断
  • docker本地部署dify,nginx80端口占用的报错
  • Spring Ioc —— 集合类型的依赖注入
  • js语言编写科技风格博客网站-详细源码
  • LINUX驱动篇(二)驱动开发
  • 埃文科技荣获2025年“数据要素×”大赛河南分赛二等奖
  • FPGA时序约束(二)--做时序约束,本质上是在干嘛
  • 新闻资讯|基于微信小程序的经济新闻资讯系统设计与实现(源码+数据库+文档)
  • ARM-进阶汇编指令
  • 基于AI与物联网的中央空调节能调控系统
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • Android修改进程优先级
  • 在IDEA里使用Google Java Format
  • UART控制器——ZYNQ学习笔记14
  • 解决Content Security Policy (CSP)问题
  • Sparse4Dv3 部署到 TensorRT-(1)
  • Gradle vs. Maven,Java 构建工具该用哪个?
  • Paimon MergeTreeWrite、Compaction 和 快照构建