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 || matrix0.length < 1) {

return 0;

}

int n = matrix.length;

int m = matrix0.length;

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

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

boolean visited\[\]\[\] = new booleannm;

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

visited00 = true;

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

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

(a, b) ->Integer.compare(matrixa\[0]a\[1],matrixb\[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 = cur0;

int j = cur1;

smallestNumber = matrixij;

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

if (i + 1 < n && visitedi + 1j == false) {

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

visitedi + 1j = true;

calculateNum++;

}

if (j + 1 < m && visitedij + 1 == false) {

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

visitedij + 1 = true;

calculateNum++;

}

}

return smallestNumber;

}

}

相关推荐
裕晟资质规划2 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
EXI-小洲2 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_961901703 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
en.en..3 小时前
C语言 标准输入 / 输出缓冲区
算法
何以解忧,唯有..4 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
QQ_21696290964 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
吃好睡好便好5 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球5 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
前端 贾公子5 小时前
第09章:上下文与记忆 (2)
java·服务器·前端
2601_962203515 小时前
Java进阶07集合(续)
java·开发语言