二维矩阵中的二分搜索
Posted
技术标签:
【中文标题】二维矩阵中的二分搜索【英文标题】:Binary search in 2D Matrix 【发布时间】:2014-04-15 07:53:49 【问题描述】:这不是作业,而是我在一个没有答案的网站上阅读的面试问题。我只是在验证我的解决方案。
问题:
给定一个按排序顺序包含 0 和 1 的矩阵。设计一个算法来返回最大数量为 1 的行索引。之后他修改了一些行按升序排序和一些降序排序的问题。
我正在考虑对每一行应用二进制搜索,这将导致 O(Rows*LogRows),但对于那些计数,这将再次导致另一个迭代,我正在考虑减少它计时,将我正在迭代的那些添加到哈希映射或字典中,然后在保存了个数后,我再次迭代以查找最大行数。
在复杂性方面是否有更快的解决方案,或者我的方法存在缺陷?
【问题讨论】:
为什么在获得第一个(升序)或第一个零(降序)的索引后还需要计数?确定一行是降序还是升序可以在单个操作中完成 - 比较第一个和最后一个元素。 抱歉,“按排序顺序”的矩阵定义不充分。请解决这个问题。 【参考方案1】:为什么在获得第一个(升序)或第一个零(降序)的索引后需要对这些进行计数?确定一行是降序还是升序可以在单个操作中完成 - 比较第一个和最后一个元素。
高级伪代码:
maxRow <- -1
maxOnes <- -infinity
For each row:
check if row is ascending or descending
do a binary search for the first 0 (if descending) or first 1 (if ascending)
use the above calculated index, and the length of the row to find number of ones in this row
if number of ones is more than maxOnes:
modify maxRow and maxOnes with the values of this line
return maxRow
这是在O(#rows*logsize(row))
完成的
【讨论】:
“比较第一个和最后一个元素”:处理全零或全一的情况。 @YvesDaoust 该行按升序或降序排序。如果row[0] < row[n-1]
- 该行正在升序。如果row[0] > row[n-1]
- 该行正在下降。否则(等于)全为 0 或全为 1。
绝对。然后在设计二分搜索时千万不要忘记这些可能性。
作为一种“低成本”优化,您可以将二分搜索限制为M
一行中的第一个元素,其中M
对应于目前已知的最佳长度。在均匀分布的情况下,这会将预期复杂度降低到O(R)
。以上是关于二维矩阵中的二分搜索的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 74. 搜索二维矩阵 ☆☆☆(二分查找)