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

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.xdnf.cn/news/19641.html

相关文章:

  • 大数据-湖仓一体
  • Pomian语言处理器研发笔记(三):使用组合子构建抽象语法树
  • SpringBoot的基础介绍,用法和配置
  • 解锁Git仓库瘦身秘籍,git-sizer真香警告
  • GitHub 宕机自救指南:应急解决方案与替代平台
  • 复刻elementUI的步骤条Steps
  • 机器翻译:python库translatepy的详细使用(集成了多种翻译服务)
  • Redis 核心概念解析:从渐进式遍历、数据库管理到客户端通信协议
  • 自由学习记录(91)
  • C++“类吸血鬼幸存者”游戏制作的要点学习
  • 计算机毕设推荐:基于python的农产品价格数据分析与预测的可视化系统的设计与实现 基于Python农产品管理系统【源码+文档+调试】
  • 前后端联合实现多个文件上传
  • Java全栈开发面试实录:从基础到微服务架构的深度解析
  • Python 基础综合与实践教案:密码验证、循环、分支条件、图形绘制
  • ReconDreamer++
  • Polkadot - ELVES
  • 你的数据是如何被保护的?
  • 解决浏览器的**混合内容安全策略**(Mixed Content Security Policy)带来的无法访问页面
  • 联合体Union
  • Backroom:信息代币化 AI 时代数据冗杂的解决方案
  • 【系统分析师】高分论文:论原型法及其在系统开发中的应用
  • 【Proteus仿真】按键控制系列仿真——LED灯表示按键状态/按键控制LED灯/4*4矩阵键盘控制LED
  • 部署在windows的docker中的dify知识库存储位置
  • NMOS概述
  • python---类.函数名(self) 和 self.函数名()的调用方式
  • 数据结构 二叉树
  • RocketMQ5.0+保姆级单点Docker部署教程
  • 暴力破解基础知识(一)
  • 深入解析 Oracle 并发与锁机制:高并发环境下的数据一致性之道
  • 【数论】P10558 [ICPC 2024 Xi‘an I] XOR Game|普及+