二维矩阵中的二分搜索

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] &lt; row[n-1] - 该行正在升序。如果row[0] &gt; row[n-1] - 该行正在下降。否则(等于)全为 0 或全为 1。 绝对。然后在设计二分搜索时千万不要忘记这些可能性。 作为一种“低成本”优化,您可以将二分搜索限制为M 一行中的第一个元素,其中M 对应于目前已知的最佳长度。在均匀分布的情况下,这会将预期复杂度降低到O(R)

以上是关于二维矩阵中的二分搜索的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode74. 搜索二维矩阵

LeetCode: 74. 搜索二维矩阵(二分查找)

[LeetCode] 74. 搜索二维矩阵 ☆☆☆(二分查找)

[LeetCode] 240. 搜索二维矩阵 II ☆☆☆(二分查找类似)

Leetcode No.74 搜索二维矩阵(二分查找)

Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)