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;

}

}

相关推荐
小熊美家熊猫系统32 分钟前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD32 分钟前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent
智者知已应修善业39 分钟前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
一只叫煤球的猫41 分钟前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
洛水水42 分钟前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
渡之1 小时前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生135902563851 小时前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker06261 小时前
LeetCodeHot100——560.和为K的子数组
算法
阿狸猿1 小时前
论微服务架构及其应用
java·微服务·架构
dtq04241 小时前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法