leetcode每日一题(2020-07-02):378. 有序矩阵中第K小的元素
Posted autumn-starrysky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题(2020-07-02):378. 有序矩阵中第K小的元素相关的知识,希望对你有一定的参考价值。
题目描述:
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
今日学习:
1.复习reduce
2.归并排序
题解:
1.直接合成一个数组然后sort
2.二分查找
3.归并排序
//令人羞耻的方法
var kthSmallest = function(matrix, k) {
let arr = []
for(let i = 0; i < matrix.length; i++) {
arr = arr.concat(matrix[i])
}
arr.sort((a, b) => a - b)
return arr[k - 1]
};
//二分查找
const getRankInMatrix = (matrix, midVal) => {
const n = matrix.length;
let rank = 0;
let row = 0; // 第一行
let col = n - 1; // 最后一列
while (row < n && col >= 0) {
if (midVal >= matrix[row][col]) { // 干掉了当前行的老大
rank += col + 1; // 干掉了col个数,排名上涨col+1
row++; // 比较下一行
} else { // 干不过当前行的老大
col--; // 留在当前行继续比较
}
}
return rank;
};
const kthSmallest = (matrix, k) => {
const n = matrix.length;
let low = matrix[0][0];
let high = matrix[n - 1][n - 1];
while (low <= high) {
const midVal = low + ((high - low) >>> 1); // 获取中间值
const rank = getRankInMatrix(matrix, midVal); // 矩阵中小于等于它的个数
if (rank < k) {
low = midVal + 1;
} else {
high = midVal - 1;
}
}
return low;
};
//归并
var kthSmallest = function(matrix, k) {
if(matrix.length < 1) return 0
let arr = matrix.reduce((a, b) => merge(a, b))
return arr[k - 1]
};
function merge(left, right){
let llen = left.length
let rlen = right.length
let i = 0
let j = 0
let res = []
while(i < llen && j < rlen){
if (left[i] < right[j]) {
res.push(left[i++])
} else {
res.push(right[j++])
}
}
while(i < llen) res.push(left[i++])
while(j < rlen) res.push(right[j++])
return res
}
以上是关于leetcode每日一题(2020-07-02):378. 有序矩阵中第K小的元素的主要内容,如果未能解决你的问题,请参考以下文章