题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一

从上面的图就可以看出,由于这个题目的特性,右上角和左下角的数有一种特性,通过和target的比较,你只有两条路可以走。在这里起始点是在右上角,通过比较,要么向左要么向下。
做题可能出现的问题
首先是越界问题:
列的起始值是为 len(array[0])-1
其次是while的判断条件问题:
看清楚是哪个变量会接近于0哪个会增加到len(array)
还有区分c++和python中不一样的表达方式,比如取长度,格式,true的大小写。
(如果你发现什么可能会犯的错误,记得私信告诉我哦,爱你哦)
python
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
i, j = 0, len(array[0])-1
while i<len(array) and j>=0:
if target > array[i][j]:
i += 1
elif target < array[i][j]:
j -= 1
else:
return True
return False
C++
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row =0;
int col = array[0].size()-1;
while (row< array.size() and col >= 0){
if (target < array[row][col])
col--;
else if (target > array[row][col])
row++;
else
return true;
}
return false;
}
};
思路二
因为从左到右是递增的,那么就可以用二分法来写。
注意事项
high=mid-1
low = mid +1;
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rowcount = array.size();
int colcount = array[0].size();
for (int i = 0; i< rowcount; i++){
int low = 0;
int high = colcount -1;
while (low <= high){
int mid = (low + high)/2;
if (target < array[i][mid])
high=mid-1;
else if (target > array[i][mid])
low = mid +1;
else
return true;
}
}
return false;
}
};
网友评论