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;

}

}

相关推荐
济南壹软网络科技有限公司3 分钟前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app
廋到被风吹走6 分钟前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式
搞科研的小刘选手7 分钟前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋10 分钟前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
一条可有可无的咸鱼13 分钟前
企业招聘信息,企业资讯进行公示
java·vue.js·spring boot·uni-app
Sammyyyyy14 分钟前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
程序猿DD40 分钟前
JUnit 5 中的 @ClassTemplate 实战指南
java·后端
爱吃山竹的大肚肚1 小时前
EasyPOI 大数据导出
java·linux·windows
sin_hielo1 小时前
leetcode 2110
数据结构·算法·leetcode
Jay20021111 小时前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习