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;
	}
}
相关推荐
John.Lewis1 小时前
数据结构初阶(13)排序算法-选择排序(选择排序、堆排序)(动图演示)
c语言·数据结构·排序算法
AI小白的Python之路1 小时前
数据结构与算法-排序
数据结构·算法·排序算法
火车叨位去19492 小时前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
小王在进步3 小时前
快速排序算法_图文详解_这一篇就够了!
排序算法
老歌老听老掉牙3 小时前
SymPy 矩阵到 NumPy 数组的全面转换指南
python·线性代数·矩阵·numpy·sympy
星期天要睡觉3 小时前
机器学习——CountVectorizer将文本集合转换为 基于词频的特征矩阵
人工智能·机器学习·矩阵
洋曼巴-young3 小时前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
楼田莉子5 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
想不明白的过度思考者6 小时前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法