剑指offer题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:
下面的二维数组,每行每列都是递增排序,如果在这个数组中查找 target 数字 7,则返回 true;如果查找数字 5,则返回 false
易入误区:
在看到这个题时,第一反应这是一个有序数组,是不是可以用有序列表的思路来进行思考呢,用上二分查找之类的方法。但是细想一下,就会发现,如果从左上角开始查找,如果命中还好说,不命中就需要向右或者向下查找,这样每一次判断结果小了都会有向右或者向下两种情况,就没法查了。
正确思路:
这个题的关键是从右上角开始查,如果命中target则返回true。如果右上角的值大于target的值,根据数组的递增的特性,右上角所在列的所有元素都会比target的值要大,因此就可以删除右上角所在列。如果右上角的值小于target的值,根据数组递增的特性,其值所在一行的元素的值都会比target小,因此可以删掉该行。然后依次判断出于右上角的值即可确定结果。
总结如下:
从右上角(左下角)开始找,
PS:类似的,从左下角开始查找也是相同的道理。
PS2:该算法的利用的是夹逼的思想,不断从左右进行逼近,直至最终结果。
代码如下:
class Solution():
def Find(self, target, array):
m = len(array) - 1
n = len(array[0]) - 1
i = 0
while i <= m and n >= 0:
if array[i][n] == target:
return True
elif array[i][n] > target:
n -= 1
elif array[i][n] < target:
i += 1
return False
if __name__ == "__main__":
arr = [[1, 4, 8, 9],
[4, 7, 10, 13]]
target = 4
s = Solution()
print(s.Find(target, arr))
Leetcode题目描述:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
解题思路1:
逐个进行数组元素遍历即可
代码1:
class Solution(object):
def findNumberIn2DArray(self, matrix, target):
if matrix ==[]:
return False
m = len(matrix)
n = len(matrix[0])
for i in range(m):
for j in range(n):
if target == matrix[i][j]:
return True
return False
解题思路2:
从右上角(左下角)开始找,
代码2:
class Solution(object):
def findNumberIn2DArray(self, matrix, target):
if matrix ==[]:
return False
m = len(matrix)
n = len(matrix[0])-1
i = 0
while i < m and n >= 0:
if target == matrix[i][n]:
return True
elif target > matrix[i][n]:
i += 1
elif target < matrix[i][n]:
n -= 1
return False
题目来源
https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof