借用下博客,记录下学习牛客网剑指offer的过程。
描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
初步想法:每行每列都是递增,就是for循环逐步查找,每一行每一行的查找,只是这种方法应该不能适应特别大的二维数组情况。时间复杂度为O(n^2),因为最坏的情况是每个元素都需要遍历一遍。
讨论区解题思路:矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。
(也可以把二分值定在右上角)
时间复杂度:O(m+n) ,其中m为行数,n为列数,最坏情况下,需要遍历m+n次。
空间复杂度:O(1)
class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
int rowCount = array.size();
int colCount = array[0].size();
int i,j;
for(i=rowCount-1,j=0;i>=0&&j<colCount;)
{
if(target == array[i][j])
return true;
if(target < array[i][j])
{
i--;
continue;
}
if(target > array[i][j])
{
j++;
continue;
}
}
return false;
}
};
附上讨论组的python解:
class Solution:
# array 二维列表
def b_rearch(self, start, stop, target, array):
if (start > stop ):
return False
mid = (stop + start ) // 2
if (array[mid] == target):
return True
elif (array[mid] > target):
return self.b_rearch(start , mid-1, target , array)
else:
return self.b_rearch(mid+1 , stop, target , array)
def Find(self, target, array):
length = len(array[0])-1
high = len(array)-1
while(high > 0):
if(array[high][0] > target):
high = high - 1
else:
break
for i in range(0,high + 1):
if(self.b_rearch(0, length, target, array[i]) == True):
return True
return False
解法应该是从二维数组的最后一行的第一个值开始比较,如果目标值比这个值小,则上移一行。如果目标值比这个值大,就开始二分查找这一行的值,从中间值开始查找。
python的题解来自:https://www.cnblogs.com/upstart/p/15012871.html