剑指offer-4 二维数组中的查找
一、题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
输出:
true
二、解题
1.解题思路
利用二维数组由上到下,由左到右的递增规律
以左下角元素或者是右上角元素为起始点开始查找。
以左下角元素为例开始查找,右边元素是比这个元素大,上边是的元素比这个元素小。于是,target比这个元素小就往上找,比这个元素大就往右找。
如果出了边界,则说明二维数组中不存在target元素。
2.代码
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
#定义行和列
rows=len(array)-1
cols=len(array[0])-1
#从左下角开始查找
#i 表示行的动态变化
i = rows
#j 表示列的动态变化
j = 0
#同时满足行和列在边界之内
while i>=0 and j <=cols:
if target<array[i][j]:
i-=1
elif target>array[i][j]:
j+=1
else:
return True
return False
3.总结
由于数组有从左至右递增,从上到下递增的规律,要找出数组中的某个数,只需按照数组的规律寻找即可,因为有规律所以可以不用暴力破解。从左下角开始,因为左下角上方的元素比它小,右方的元素比它大,如果target大于左下角的元素,那target一定在其右边,列向右移动即可;如果target小于左下角的元素,那target一定在其上方,行向上移动即可;但是注意不要超出边界。如果向上以及向右均已经到达边界还没有找到时,那说明此数组中没有target.