Java 排序矩阵中的第k个最小元素

Java 排序矩阵中的第k个最小元素,java,arrays,sorting,multidimensional-array,heap,Java,Arrays,Sorting,Multidimensional Array,Heap,所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败 问题是: 给定一个nxn矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素 例如: matrix = [[1, 5, 9], [10, 11, 13], [12, 13, 15]] k = 8 返回:13 我的方法是使用minHeap,即使它声明数组已排序,我仍然需要确保将其从最小值排序到最大值 这是我的密码: 类解决方案{ 公共整数kt

所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败

问题是:

给定一个
nxn
矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素

请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素

例如:

matrix = [[1, 5, 9], [10, 11, 13], [12, 13, 15]]
k = 8
返回:13

我的方法是使用minHeap,即使它声明数组已排序,我仍然需要确保将其从最小值排序到最大值

这是我的密码:

类解决方案{
公共整数kthSmallest(整数[][]矩阵,整数k){
int row=矩阵长度;
int col=矩阵[0]。长度;
int结果=0;
HashMap=newHashMap();
//填充哈希映射
对于(int i=0;in1.getValue()-n2.getValue());
pq.addAll(map.entrySet());
对于(int i=0;i
以下是我的意见:

Input 1: [[1,5,9],[10,11,13],[12,13,15]] 
k = 8 

Input 2: [[1,2],[1,3]] 
k = 1 
以下是产出:

Output 1: 13
Output 2: 2
请注意,对于我的第一个输入(2d数组中第8个最小的元素是13),代码运行得很好,但是对于第二个输入,代码返回2作为我的第一个最小元素,而不是返回1


有人能帮我修一下密码吗?我请求您不要实施一些奇特的速记排序技术,例如数组。排序。。。这对我来说并不理想,因为我正在努力学习如何实现堆。非常感谢:)

为了解决这个问题,我们还可以进行二进制搜索(效率更高一些):

公共类解决方案{
公共静态最终整数kthSmallest(最终整数[][]矩阵,最终整数k){
int lo=矩阵[0][0];
int hi=矩阵[matrix.length-1][matrix[0].长度-1]+1;
while(lo=0&&matrix[row][col]>mid){
col--;
}
计数+=(列+1);
}
如果(计数
您可以使用该方法在一个流中迭代二维数组的行:

publicstaticvoidmain(字符串[]args){
int[][]矩阵1={{1,5,9},{10,11,13},{12,13,15};
int[][]矩阵2={{1,2},{1,3};
System.out.println(kthSmallest(matrix1,8));//13
System.out.println(kthSmallest(matrix2,1));//1
}
公共静态int kthSmallest(int[][]矩阵,int k){
返回数组.stream(矩阵)
.flatMapToInt(数组::流)
.skip(k-1)
.findFirst()
.getAsInt();
}