📌  相关文章
📜  矩阵中存在的给定范围 L 到 R 中的数字计数(1)

📅  最后修改于: 2023-12-03 15:27:17.547000             🧑  作者: Mango

题目描述

给定一个矩阵,矩阵中的数均为正数,现在需要统计矩阵中所有数值在给定范围 L 到 R 中的数字个数。并返回统计结果。

示例

给定范围:L=1,R=3

矩阵:

[
[3, 4, 5],
[1, 2, 3],
[4, 5, 6]
]

输出:6

解法

一种简单的思路是暴力枚举矩阵中的每个数,统计其是否在给定范围内。

时间复杂度为 O(n^2),空间复杂度为 O(1)。

def count_numbers(matrix, L, R):
    count = 0
    for row in matrix:
        for num in row:
            if L <= num <= R:
                count += 1
    return count

但是这个解法效率较低,如果矩阵较大,时间复杂度将会非常高。

另一种优化的方式是采用二分查找,并结合矩阵的有序性。

具体来说,我们可以从矩阵的右上角(或者左下角)开始搜索。

如果当前数值小于 L,则向下移动一行;如果当前数值大于 R,则向左移动一列;否则,我们找到一个满足条件的数字,将该位置向左移动一列,并继续向下搜索。

时间复杂度为 O(n),空间复杂度为 O(1)。

def count_numbers(matrix, L, R):
    count = 0
    i, j = 0, len(matrix[0])-1
    while i < len(matrix) and j >= 0:
        if matrix[i][j] < L:
            i += 1
        elif matrix[i][j] > R:
            j -= 1
        else:
            count += j + 1
            i += 1
    return count

总结

矩阵中存在的给定范围 L 到 R 中的数字计数,可以通过暴力枚举或者优化后的二分查找实现。

如果对时间复杂度要求较高,推荐使用优化后的二分查找方法。