【发布时间】:2011-07-06 22:52:09
【问题描述】:
在一次 Google 采访中被问到以下问题:
给定一个存储整数的二维数组,垂直和水平排序。
编写一个将整数作为输入并输出
bool的方法,说明该整数是否在数组中。
最好的方法是什么?它的时间复杂度是多少?
【问题讨论】:
-
问题是......?
-
按哪种方式排序(即左->右、上->下=最小->最大)?
标签: algorithm
在一次 Google 采访中被问到以下问题:
给定一个存储整数的二维数组,垂直和水平排序。
编写一个将整数作为输入并输出
bool的方法,说明该整数是否在数组中。
最好的方法是什么?它的时间复杂度是多少?
【问题讨论】:
标签: algorithm
从矩阵的左下角开始,按照以下规则遍历矩阵:
矩阵遍历基于以下条件:
时间复杂度:(感谢 Martinho Fernandes)
时间复杂度为O(N+M)。在最坏的情况下,搜索的元素在左上角,这意味着你会向上 N 次,离开 M 次。
示例
输入矩阵:
--------------
| 1 | 4 | 6 |
--------------
| 2 | 5 | 9 |
--------------
| *3* | 8 | 10 |
--------------
要搜索的数字:4
第 1 步: 从有 3 的单元格开始(左下角)。
3
| 1 | 4 | 6 |
--------------
| 2 | 5 | 9 |
--------------
| 3 | *8* | 10 |
--------------
第 2 步: 8 > 4:向上移动
| 1 | 4 | 6 |
--------------
| 2 | *5* | 9 |
--------------
| 3 | 8 | 10 |
--------------
第 3 步: 5 > 4:向上移动
| 1 | *4* | 6 |
--------------
| 2 | 5 | 9 |
--------------
| 3 | 8 | 10 |
--------------
第 4 步:
4=4:返回数字的索引
【讨论】:
我将首先询问有关“垂直和水平排序”意味着什么的详细信息
如果矩阵的排序方式是每行的最后一个元素小于下一行的第一个元素,您可以对第一列运行二进制搜索以找出该数字在哪一行,并且然后在该行上运行另一个二进制搜索。该算法将花费 O(log C + log R) 时间,其中 C 和 R 分别是行数和列数。使用对数的属性,可以将其写为 O(log(C*R)),如果 N 是数组中的元素数,则与 O(log N) 相同。这与将数组视为一维数组并对其进行二分查找几乎相同。
但是矩阵可以按照每行最后一个元素不小于下一行第一个元素的方式排序:
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11
在这种情况下,您可以同时运行某种水平和垂直二分搜索:
这种方法也是元素数量的对数。
【讨论】:
想到的第一种方法是垂直二分搜索,然后是水平二分搜索,当你找到它应该在的行时。复杂度将是O(log NM),其中N 和M 是数组。
进一步说明: 只考虑每行的第一个数字。当您对指定数字执行这些第一个数字的二进制搜索时,如果幸运,结果将是指定的数字,否则它将是指定数字之前或之后的位置,具体取决于二进制搜索实现.一旦找到指定数字应该介于其间的前两个数字,您就知道该数字在该行中,如果该数字在该行中,则第二次二进制搜索将找到该数字。
【讨论】:
1 2 3 | 3 4 100 | 4 5 1000。我们想搜索100。您的二分搜索将返回最后一行,而100 不属于最后一行。下一步是什么?