题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
- 二维数组是由上往下、由左往右递增的,但是左下方的元素和右上方的元素大小关系未定。因此循环遍历第一行,在循环内部用二分查找target有没有出现在该列中,如果第一行的某一元素已经大于target则返回0
- 在讨论区学习了大神的思路:
矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,
因此从左下角开始查找,当要查找数字比左下角数字大时。右移
要查找数字比左下角数字小时,上移
Code
- cpp
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int len = array[0].size();
for(int i = 0; i<len; i++){
if(array[0][i] > target){
return 0;
} else {
int l = 0, r = array.size()-1, mid = 0;
while(l <= r){
mid = (l+r)/2;
if(array[mid][i] == target){
return 1;
} else if(array[mid][i] > target){
r = mid-1;
} else {
l = mid+1;
}
}
}
}
return 0;
}
};
- java
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null || array.length == 0 || array[0].length == 0) return false;
int rowLength = array.length, colLength = array[0].length;
int row = rowLength-1, col = 0;
while(row>=0 && col<colLength) {
if(array[row][col] == target) {
return true;
} else if(array[row][col] > target) {
row--;
} else {
col++;
}
}
return false;
}
}
总结
- 二维数组判空要特别注意
if(array == null || array.length == 0 || array[0].length == 0) return false;