【发布时间】:2021-05-02 05:05:33
【问题描述】:
我正在编写一个 Python 程序以递归方式在二维数组中查找目标,以解决 this 问题。我正在使用二进制搜索方法递归查找目标是否存在,但它给了我这个最大递归深度超出错误。有什么建议吗?
我的代码:
def searchMatrix(self, matrix, target):
small = [0,0]
big = [len(matrix)-1,len(matrix[0])-1]
return self.searchUtil(matrix,target,small,big)
def searchUtil(self,matrix,target,small,big):
if big >= small:
#find the mid target
midx,midy = (small[0]+big[0])/2,(small[1]+big[1])/2
if matrix[midx][midy] == target:
return True
#if mid is >= target, it will exclude all the element smaller than it
if matrix[midx][midy] >= target:
return self.searchUtil(matrix,target,[midx,0],[midx,midy-1]) or self.searchUtil(matrix,target,[0,midy],[midx-1,midy]) or self.searchUtil(matrix,target,[0,0],[midx-1,midy-1])
else:
#if mid is < target, it will exclude all the element bigger than it
return self.searchUtil(matrix,target,[midx+1,0],[len(matrix)-1,midy]) or self.searchUtil(matrix,target,[0,midy+1],[midx,len(matrix[0])-1]) or self.searchUtil(matrix,target,[midx+1,midy+1],[len(matrix)-1,len(matrix[0])-1])
else:
return False
【问题讨论】:
-
我建议你使用元组而不是数组来区分大小。
-
在searchUtil中,首先if语句应该检查
big == small -
你认为解在对角线上吗?否则,您应该单独更改坐标。
-
由于对于这种规模的问题没有理由进行适当的二分搜索来达到递归限制,因此您在更新大小时一定有错误保持
big >= small,因此递归循环永远不会结束。一个问题是你有midx,midy = (small[0]+big[0])/2,(small[1]+big[1])/2这是浮点而不是整数除法。这应该会导致以下行出现错误if matrix[midx][midy] == target:,因为数组索引应该是整数。尝试整数除法,即使用//。 -
如果矩阵从最小值到最大值排序,则发布的二进制搜索算法将适用,但事实并非如此。只有单独的行和列是有序的,而不是整个矩阵。
标签: python algorithm binary-search