剑指offer第一题
二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
找规律:
1.每一个对角线元素是他所对应的矩阵中最大的元素,例如arr[1][1]是二维矩阵最大的元素
2.整个矩阵的最大值是右下角的元素
3.从左往右依次增大,从上往下依次增大
自己的方法:
1.判断长度:二维数组如果空或者长度是0, 返回false。
2.判断临界值:如果该整数大于最大值或者小于最小值则返回false
3.遍历对角线元素,如果小于则遍历对角线元素所在的行和列
代码
public class Solution {
public boolean Find(int target, int [][] array) {
if(array==null||array.length==0||array[0].length==0){
return false;
}
if(array[array.length-1][array.length-1]<target||array[0][0]>target){
return false;
}else if(array[array.length-1][array.length-1]==target||array[0][0]==target){
return true;
}
int index=array.length;
for(int i=0;i<index;i++){
if(target<array[i][i]){
for(int j=0;j<i;j++){
if(array[i][j]==target){
return true;
}
if(array[j][i]==target){
return true;
}
}
}
}
return false;
}
}
评论区的官方解法
- 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,
- 因此从左下角开始查找,当要查找数字比左下角数字大时。右移
- 要查找数字比左下角数字小时,上移
代码:
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;
}
};