Leetcode 378. 有序矩阵中第 K 小的元素 二分查找

原题链接:Leetcode 378. 有序矩阵中第 K 小的元素

解题思路:

参考自博客:LeetCode题练习与总结:有序矩阵中第 K 小的元素--378

cpp 复制代码
class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        int n=matrix.size();
        int l=matrix[0][0];
        int r=matrix[n-1][n-1];
        while(l<r){
            int mid=l+(r-l)/2;
            int j=n-1;
            int cnt=0;
            for(int i=0;i<n;i++){
                while(j>=0 && matrix[i][j]>mid){
                    j--;
                }
                cnt+=(j+1);
            }
            if(cnt<k){
                l=mid+1;
            }
            else{
                r=mid;
            }
        }
        return l;
    }
};

为什么left一定在矩阵中?

  • 循环过程中,矩阵中第k小的那个数始终在区间[left, right]中

  • 循环过程中,left和right可能不是矩阵中的元素,但是[left, right]中某个元素 "在矩阵中" 且 "满足第k小"

  • 当right == left时,[left, right]中只有一个元素了(即left),所以此时left必然 "在矩阵中" 且

    "满足第k小"

此题的完整流程+过程演示:

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int kthSmallest(vector<vector<int>>& matrix, int k) {
    int n=matrix.size();
    int l=matrix[0][0];
    int r=matrix[n-1][n-1];
    int round=1;
    while(l<r){
        cout<<"第" <<round<<"次查找:"<<endl;
        cout<<"开始时:" <<endl;
        int mid=l+(r-l)/2;
        int j=n-1;
        int cnt=0;
        cout<<"left:"<<l<<endl;
        cout<<"right:"<<r<<endl;
        cout<<"mid:"<<mid<<endl;
        for(int i=0;i<n;i++){
            while(j>=0 && matrix[i][j]>mid){
                j--;
            }
            cnt+=(j+1);
        }
        if(cnt<k){
            l=mid+1;
        }
        else{
            r=mid;
        }
        round++;
        cout<<"找到" <<cnt<<"个小于等于mid的数"<<endl;
        cout<<"更新后:"<<endl;
        cout<<"left:"<<l<<endl;
        cout<<"right:"<<r<<endl;
        cout<<"------------------------------------------------------"<<endl;
    }
    return l;
}

int main()
{
    vector<vector<int>> mat;
    mat.push_back({1,5,9});
    mat.push_back({10,11,13});
    mat.push_back({12,13,15});
    int res=kthSmallest(mat, 8);
    cout<<res<<endl;
    return 0;
}
cpp 复制代码
第1次查找:
开始时:
left:1
right:15
mid:8
找到2个小于等于mid的数
更新后:
left:9
right:15
------------------------------------------------------
第2次查找:
开始时:
left:9
right:15
mid:12
找到6个小于等于mid的数
更新后:
left:13
right:15
------------------------------------------------------
第3次查找:
开始时:
left:13
right:15
mid:14
找到8个小于等于mid的数
更新后:
left:13
right:14
------------------------------------------------------
第4次查找:
开始时:
left:13
right:14
mid:13
找到8个小于等于mid的数
更新后:
left:13
right:13
------------------------------------------------------
13
相关推荐
wuqingshun3141597 分钟前
蓝桥杯 R格式
c语言·c++·算法·职场和发展·蓝桥杯·r语言
oioihoii14 分钟前
C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革
算法·c++20
圣保罗的大教堂19 分钟前
《算法笔记》9.6小节 数据结构专题(2)并查集 问题 D: More is better
算法
小钊(求职中)24 分钟前
Lambda 和 Stream 从 0 到 1,从基础到实战
java·开发语言·后端·算法
phoenix@Capricornus1 小时前
常用序列的离散时间傅里叶变换(DTFT)
图像处理·算法
昂子的博客1 小时前
热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二
java·数据结构·算法·leetcode·职场和发展
longlong int1 小时前
【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)
c++·算法·散列表
G皮T1 小时前
【Python Cookbook】字符串和文本(二)
数据结构·python·算法·字符串
Code哈哈笑2 小时前
【机器学习】从回声定位到优化引擎:蝙蝠算法在SVR超参数优化中的应用
人工智能·算法·机器学习·蝙蝠算法
HR Zhou2 小时前
群体智能优化算法-沙丁鱼群优化算法(Salp Swarm Algorithm (SSA,含Matlab源代码)
算法·机器学习·matlab·优化·群体智能优化