找到排序矩阵中从小到大第K个数字
一 题目描述
在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。
二 题解
由于排序矩阵中的每一行都是递增的,并且每一列都是递增的。从小到大第k个数,实际上就是第k小的数。思路如下:
假设排序矩阵共有row行和col列,由于每行是递增的,我们只要选择出每行的最小数(一共row个)并从这row个数中选出最小的数来,重复这个过程k次,第k次选择出的最小值就是整个矩阵中第k小的数。
代码如下:
class Solution
{
public:
/**
* @param matrix: a matrix of integers
* @param k: An integer
* @return: the kth smallest number in the matrix
*/
int kthSmallest(vector<vector<int>> &matrix, int k)
{
size_t row = matrix.size();
size_t col = matrix[0].size();
if(row == 0 || col == 0)
return -1;
int minRows[row];//用于存储每行的最小值对应的列数
memset(minRows,0,sizeof(minRows));//对minRows初始化,且初始值都为0
if(k > row * col)//错误处理
return -1;
int rs;
int tmp;
for(int cnt = 1; cnt <= k; cnt++)
{
int min_val = INT_MAX;//每次比较都需要初始化,注意该变量定义的位置
for(int row_index = 0; row_index < row; row_index++)
{
if(minRows[row_index] < col)//注意这个判断条件一定要加上,防止越界
{
if(matrix[row_index][minRows[row_index]] < min_val)
{
min_val = matrix[row_index][minRows[row_index]];
tmp = row_index;
}
}
}
minRows[tmp]++;//更新相应行中最小值的位置,要注意此处的位置,是在row轮循环之后才能找出最小值
if(cnt == k)
rs = min_val;
}
return rs;
}
};
该算法思路表简单,算法的时间复杂度为O(k*row),此外,有几个需要注意的地方:
1.我们每次选择出的最小值指的是这row个数中的最小值,所以mi_val这个变量需要在每次循环开始的时候才定义,这里我定义的是INT_MAX,所以所有的行需要遍历一一遍。
2.在每次进行row轮循环的时候,一定不要忘记判断,相应的值的列数的索引是否已经达到最大值。
3.注意minRows数组更新的时候是在row轮循环结束的后才进行更新。
============================================================================================================
此外,本题是从列的角度来考虑的,即每次找出一列数中的最小值来;,当然也可从行的角度来考虑,每次找出一行数中的最小值来,重复k次,第k次的最小值就是最终结果。两种方法思想类似,利用第二种方法的话时间复杂度就变成了O(k*col)。
当列数大于行数的时候,用第一种方法比较好;而当行数大于列数的时候用第二种方法比较好,当然前提是行数和列数的差值比较大,否则两种方法性能差不多;当然,也可以结合这两种情况,对于行列数不同的情况时,采用不同方法。
找到排序矩阵中从小到大第K个数字的更多相关文章
- 排序矩阵中的从小到大第k个数 · Kth Smallest Number In Sorted Matrix
[抄题]: 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的定义为:每一行递增,每一列也递增. [思维问题]: 不知道应该怎么加,因为不是一维单调的. [一句话思路]: 周围两个数给x或y挪一 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
/** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...
- 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数
题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...
- 杨氏矩阵:查找x是否在矩阵中,第K大数
参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...
- [算法]找到无序数组中最小的K个数
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...
- [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...
- 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
- lintcode-401-排序矩阵中的从小到大第k个数
401-排序矩阵中的从小到大第k个数 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的定义为:每一行递增,每一列也递增. 样例 给出 k = 4 和一个排序矩阵: [ [1 ,5 ,7], [ ...
- 矩阵中的路径 DFS+剪枝
给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...
随机推荐
- dos6章
现在开始: 在CMD使用IF /?打开IF的系统帮助(自己看我就不全部列出来了),我们会发现IF有3种基本的用法!执行批处理程序中的条件处理. IF [NOT] ERRORLEVEL number c ...
- 2018-4-25 html基础知识
HTML 理解HTML元素以及构成 1.理解HTML元素以及构成 HTML是一种标记语言,是由一个一个的标记组成的,用于告诉浏览器怎么构建网页的.就像人体里面的DNA一样,控制着人体的组成.同时,也正 ...
- SharePoint 2013 新特性 (三) 破改式 —— 设计管理器的使用 [1.设备通道]
首先,哥们儿们会问,为啥要有设计管理器呢,不是原来就可以编辑页面了么,原来那个编辑不了模板页和布局页,也不能打包,而且也看不到具体HTML代码,不能编辑CSS,当然,你安装的SharePoint De ...
- 嵌入式C语言编译器
GCC与gcc: 初识编译器: 扩展问题: 如何理解“多语言混合开发”? 参考: 狄泰软件学院唐佐林视频教程
- jupyter notebook添加虚拟环境
原本以为,当进入虚拟环境之后,再运行jupyter notebook应该是这个环境下的jupyter,比如我默认创建一个文件,这个文件调用的编译器应该是这个虚拟环境中的编译器,实际上并不是 当你进入j ...
- 利用JQuery 解析MVC控制器传到前台的Json数据
<script type="text/javascript"> function Getweb() { var name = $("#CityName&quo ...
- Maven,gradle的搭建工具
Glassfish安装.基本使用 一.glassfish简介 glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器. 二.glassfish知识点 1.dom ...
- hello.java分析
如下图源码所示: 该段代码声明了一个entity实体类,该类有一个变量name,对该变量写了对应的get和set方法.类中还有一个空的构造方法hello(). @RequestScoped用于指定一个 ...
- 项目工程中的WebRoot与WebContent有什么区别?
[1] 在MyEclipse中创建web项目后,web程序的根目录文件夹是WebRoot,而创建dynam web project时候,web程序的根 目录文件夹是WebContent,他们之间没有本 ...
- maya权重拷贝一对一,一对多
是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送 ...