【题目描述】

Find the kth smallest number in at row and column sorted matrix.

在一个排序矩阵中找从小到大的第 k 个整数。

排序矩阵的定义为:每一行递增,每一列也递增。

【题目链接】

www.lintcode.com/en/problem/kth-smallest-number-in-sorted-matrix/

【题目解析】

寻找第k小的数,可以联想到转化为数组后排序,不过这样的时间复杂度较高:O(n^2 log n^2) + O(k).

进一步,换种思路,考虑到堆(Heap)的特性,可以建立一个Min Heap,然后poll k次,得到第k个最小数字。不过这样的复杂度仍然较高。

考虑到问题中矩阵本身的特点:排过序,那么可以进一步优化算法。

[1 ,5 ,7],

[3 ,7 ,8],

[4 ,8 ,9],

因为行row和列column都已排序,那么matrix中最小的数字无疑是左上角的那一个,坐标表示也就是(0, 0)。寻找第2小的数字,也就需要在(0, 1), (1, 0)中得出;以此类推第3小的数字,也就要在(0, 1), (1, 0), (2, 0), (1, 1), (0, 2)中寻找。

在一个数字集合中寻找最大(Max)或者最小值(Min),很快可以联想到用Heap,在Java中的实现是Priority Queue,它的pop,push操作均为O(logn),而top操作,得到堆顶仅需O(1)。

从左上(0, 0)位置开始往右/下方遍历,使用一个Hashmap记录visit过的坐标,把候选的数字以及其坐标放入一个大小为k的heap中(只把未曾visit过的坐标放入heap),并且每次放入前弹出掉(poll)堆顶元素,这样最多会添加(push)2k个元素。时间复杂度是O(klog2k),也就是说在矩阵自身特征的条件上优化,可以达到常数时间的复杂度,空间复杂度也为O(k),即存储k个候选数字的Priority Queue (Heap)。

【参考答案】

www.jiuzhang.com/solutions/kth-smallest-number-in-sorted-matrix/

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. C++ 栈和堆的区别
  2. python知识点总结
  3. Neo4j批量插入(Batch Insertion)
  4. wp8 --退出程序
  5. git reset 理解
  6. DotNetBar v12.2.0.7 Fully Cracked
  7. css透明(支持各浏览器)
  8. ARRAY_SIZE宏
  9. Krypton Factor
  10. 读书笔记 (一) ———Fundamentals of Multiagent Systems with NetLogo Examples by Prof. Jose M Vidal
  11. Linux read/write fread/fwrite两者区别
  12. shell数组(产生不同的随机数)
  13. Eloquent ORM 之关联查询
  14. 转: object 和embed 标签播放flash
  15. boost 的函数式编程库 Phoenix入门学习
  16. Oracle 总账年终结算流程
  17. C#压缩解压文件
  18. python爬虫之requests的基本使用
  19. PDF.js 分片下载的介绍2:分片下载demo
  20. Xmodem协议简介

热门文章

  1. 一键安装LAMP
  2. Coco2dx制作一个3D旋转的效果
  3. 9.1、Libgdx的输入处理的配置和查询
  4. 从"按层次输出二叉树"到"求解二叉树深度"的总结
  5. MySQL正则表达式初步
  6. FFMPEG结构体分析:AVPacket
  7. Android Studio 1.2.2设置显示行号
  8. Android下用Activity实现圆角的自定义弹窗
  9. FPGA学习笔记(二)模块建立及变量连接
  10. TrueType字体的后缀名解释