如果您在二维数组上进行二分查找,matrix[mid/n][mid%n] 是如何给出中间值的?

If you're doing binary search on a 2D array, how does matrix[mid/n][mid%n] give you the middle value?

我正在努力理解以下内容solution from Leetcode

def searchMatrix(self, matrix, target):
    n = len(matrix[0])
    lo, hi = 0, len(matrix) * n
    while lo < hi:
        mid = (lo + hi) / 2
        x = matrix[mid/n][mid%n]
        if x < target:
            lo = mid + 1
        elif x > target:
            hi = mid
        else:
            return True
    return False

matrix[mid/n][mid%n]如何给你中间值?

mid 是 m*n 矩阵的线性版本的索引。您需要将其转换为行和列索引。您看到的是给定 n 列的 q 的久为人知的转换:row = int(q / n)col = q % n.

n = 10可能有助于查看;在这种情况下,mid 是直接的十进制数字。第一个数字是行,第二个是列。可视化:

 0  1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 ...

你知道这是怎么回事吗?十位数字 (row = mid // 10) 和个位数字 (col = mid % 10) 构成 10 列矩阵的索引。

这是一种以线性方式遍历数组并将线性索引转换为二维索引的方法。如果您有一个 3x3 阵列,则有 9 个单元格。在主要行(通过跨行创建线性索引)中,编号为 0-8,线性索引将如下所示:

0 1 2
3 4 5
6 7 8

二维索引为:

(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)

诀窍是 mid/n 是行,mid%n 是列。检查整个数组意味着检查所有 9 个元素。 4/3 是 1,中间。 4%3 也是 1,又是中间。就看知道/是整数除法,%是mod,还是整数除法后的余数

我认为这是一个很酷的问题,因为它同时使用了两种除法和从一维内存创建二维矩阵的方式。