378. 有序矩阵中第 K 小的元素

378. 有序矩阵中第 K 小的元素

原题链接:

378. 有序矩阵中第 K 小的元素

https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/description/

完成情况:

解题思路:

参考代码:

__378有序矩阵中第K小的元素__直接排序

java 复制代码
package 西湖算法题解___中等题;

import java.util.Arrays;

public class __378有序矩阵中第K小的元素__直接排序 {
	public int kthSmallest(int[][] matrix, int k) {
		/*
		给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
		请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。


		 */
		int rows = matrix.length;   //行row
		int cols = matrix[0].length;    //列col
		int sorted [] = new int[rows * cols];   //组合成一排数组,进行排序
		int index = 0;
		for (int row [] : matrix){      //每次获取matrix里的int row [] 数据
			for (int num : row){    //同时再在每一行row[]获取到每一个数
				sorted[index++] = num;
			}
		}
		Arrays.sort(sorted);
		return sorted[k-1];
	}
}

__378有序矩阵中第K小的元素__归并排序

java 复制代码
package 西湖算法题解___中等题;

import java.util.Comparator;
import java.util.PriorityQueue;

public class __378有序矩阵中第K小的元素__归并排序 {
	public int kthSmallest(int[][] matrix, int k) {
		PriorityQueue<int []> priorityQueue = new PriorityQueue<int []>(new Comparator<int[]>() {
			@Override
			public int compare(int[] a, int[] b) {
				return a[0] - b[0];
			}
		});
		//--------------------------------------------------------------------------
		int n = matrix.length;
		for (int i = 0;i<n;i++){
			priorityQueue.offer(new int[]{matrix[i][0],i,0});
		}
		//--------------------------------------------------------------------------
		for (int i = 0;i<k-1;i++){
			int  now [] = priorityQueue.poll();
			if (now[2] != n -1){
				priorityQueue.offer(new int[]{matrix[now[1]][now[2] + 1],now[1],now[2]+1});
			}
		}
		return priorityQueue.poll()[0];
	}
}

__378有序矩阵中第K小的元素__二分查找

java 复制代码
package 西湖算法题解___中等题;

public class __378有序矩阵中第K小的元素__二分查找 {
	public int kthSmallest(int[][] matrix, int k) {
		int n = matrix.length;
		int left = matrix[0][0];
		int right = matrix[n-1][n-1];
		while (left < right){
			int mid = left + ((right - left) >> 1 ) ;
			if (myCheck(matrix,mid,k,n)){
				right = mid;
			}else {
				left = mid + 1;
			}
		}
		return left;
	}

	private boolean myCheck(int[][] matrix, int mid, int k, int n) {
		int i = n-1;
		int j = 0;
		int num = 0;
		while (i >= 0 && j<n){
			if (matrix[i][j] <= mid){
				num += (i+1);
				j++;
			}else {
				i--;
			}
		}
		return num >= k;
	}
}
相关推荐
Ning_.14 分钟前
力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
c语言·算法·leetcode
抓住鼹鼠不撒手21 分钟前
力扣 429 场周赛-前两题
数据结构·算法·leetcode
南宫生1 小时前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
源码~185381628002 小时前
短视频矩阵系统的视频批量剪辑源码技术开发,支持OEM
线性代数·矩阵·音视频
-$_$-2 小时前
【LeetCode 面试经典150题】详细题解之滑动窗口篇
算法·leetcode·面试
pzx_0014 小时前
【LeetCode】94.二叉树的中序遍历
算法·leetcode·职场和发展
DogDaoDao4 小时前
leetcode 面试经典 150 题:矩阵置零
数据结构·c++·leetcode·面试·矩阵·二维数组·矩阵置零
FG.4 小时前
Day35汉明距离
java·leetcode
xiaoshiguang35 小时前
LeetCode:404.左叶子之和
java·算法·leetcode
凭君语未可6 小时前
详解归并排序
算法·排序算法