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

简介: 378. 有序矩阵中第 K 小的元素
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

@TOC


前言

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

你必须找到一个内存复杂度优于 O(n2) 的解决方案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

给定一个目标,想知道<= 100的数有几个,怎么快能求出来?
在这里插入图片描述
往左走,获得0个
在这里插入图片描述
走到90,左边的都是小于100的数,获得左边的数量
在这里插入图片描述
往下走,小于等于100的,加左边的数,
就这样一直卡到结束,你正确的获得整个数组中有多少个数<=100

二分

整个数组中最小的是谁?左上角的数
那整个数组中,最大的数是谁?右下角的数
第一百小的数一定在一到1000之间, 看看<= 500的数有几个?

如果<=500有200个,目标大了

有可能最后得到<=785的数有100个,但是数组中没有这个数,应该是< =785并离它最近的数
我每次让你过的时候求俩信息,
第一,小于等于某一个值个数有几个,
第二,最接近它的是谁?

代码

class Solution {
    public static class Info{
        public int near;
        public int num;
        public Info(int n1,int n2){
            near=n1;
            num=n2;
        }
    }
    public Info noMoreNum(int[][] matrix,int value){
        int near=Integer.MIN_VALUE;
        int num=0;
        int n=matrix.length;
        int m=matrix[0].length;
        int row=0;
        int col=m-1;
        while(row<n&&col>=0){
            if(matrix[row][col]<=value){
                near=Math.max(near,matrix[row][col]);
                num+=col+1;
                row++;
            }else{
                col--;
            }
        }
        return new Info(near,num);
    }
    public int kthSmallest(int[][] matrix, int k) {
        int n=matrix.length;
        int m=matrix[0].length;
        int left=matrix[0][0];
        int right=matrix[n-1][m-1];
        int ans=0;
        while(left<=right){
            int mid=left+((right-left)>>1);
            Info info=noMoreNum(matrix,mid);
            if(info.num<k){
                left=mid+1;
            }else{
                ans=info.near;
                right=mid-1;
            }
        }
        return ans;
    }
}
相关文章
|
Kubernetes Cloud Native 安全
一文彻底搞懂 Container
设想一下,在我们的日常项目开发过程中,存在一个应用服务,其使用一些基础库函数并具有某些依赖项。如果我们在不支持这些依赖项的环境平台上运行此应用程序,那么,我们可能会遇到意外错误。随着 DevOps 及云原生理念的注入,我们希望我们所开发的应用程序能够可以跨多个操作系统及平台正常运行。
1953 0
|
11月前
|
JavaScript 前端开发 测试技术
如何确保 Babel 插件的兼容性?
如何确保 Babel 插件的兼容性?
289 60
|
Linux 开发工具
如何在 Linux 中编辑配置文件?
如何在 Linux 中编辑配置文件?
628 2
如何在 Linux 中编辑配置文件?
|
JSON 自然语言处理 数据格式
【自定义插件系列】用自定义插件在阿里云百炼上生成一篇图文并茂的文章
本文介绍了如何在阿里云百炼平台上利用自定义插件生成图文并茂的文章。通过大模型生成小红书风格的文章,提取关键元素生成图像提示词,结合文生图插件生成图片,并最终整合文本与图像输出给用户。整个流程包括多个步骤:从创建对话型工作流开始,经过多次大模型处理、脚本转换和自定义插件操作,到最后完成图文混排的输出。
755 0
|
6月前
|
人工智能 运维 Cloud Native
Argo Workflows at KubeCon Europe 2025: 多元场景的云原生任务编排
Argo Workflow在KubeCon Europe 2025展示了其在AI/ML/HPC任务、事件驱动、平台工程、批量数据处理、混沌测试等多元场景的云原生任务编排能力。
|
6月前
|
SQL 监控 数据可视化
如何选择好用的BI平台?BI报表管理与BI可视化平台功能优势比拼!
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
10月前
|
存储 监控 数据可视化
设计行业如何借助协作软件提升团队协作力?
随着设计项目规模和复杂性的增加,设计行业越来越依赖协作软件来提高工作效率、加强团队协作、支持远程办公、实现文件版本控制等,确保项目高效推进。协作软件不仅优化了设计流程,还促进了创意交流和团队创新。
|
机器学习/深度学习 测试技术 开发者
最新PyCharm下载安装以及Python环境搭建教程(含Python入门教程)
最新PyCharm下载安装以及Python环境搭建教程(含Python入门教程)
2101 1
|
12月前
|
机器学习/深度学习 数据采集 人工智能
利用AI技术提升文本分类效率
【8月更文挑战第73天】在信息爆炸的时代,文本数据的快速增长使得文本分类成为数据处理的重要环节。本文将介绍如何利用AI技术提升文本分类的效率和准确性,包括数据预处理、模型选择与训练以及结果评估等关键环节。通过实际案例的代码示例,我们将展示如何实现一个高效的文本分类系统。
|
API Android开发 开发者
Android经典实战之使用ViewCompat来处理View兼容性问题
本文介绍Android中的`ViewCompat`工具类,它是AndroidX库核心部分的重要兼容性组件,确保在不同Android版本间处理视图的一致性。文章列举了设置透明度、旋转、缩放、平移等功能,并提供了背景色、动画及用户交互等实用示例。通过`ViewCompat`,开发者可轻松实现跨版本视图操作,增强应用兼容性。
390 5