📅  最后修改于: 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 中的数字计数,可以通过暴力枚举或者优化后的二分查找实现。
如果对时间复杂度要求较高,推荐使用优化后的二分查找方法。