剑指offer——二维数组中的查找
二维数组中的查找
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&&tqId=11154&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

解题思想:
由题目可得,其每一行从左到右依次递增,最右元素为行最大,其每一列从上到下依次递增,最下元素为列最大,所以在比较的时候
我们可以使用类二分思想,从一个较大元素开始判断,即从右上角和左下角的元素开始判断
1.右上角元素:列数初始值为arr.size()-1,行数初始值为array.s
目标值>右上角元素:即大于其所在行的所有元素,所以我们可以行数++,即跳过这一行,扫描方向:下
目标值<右上角元素:即小于其所在列的所有元素,所以我们可以列数 - -,即跳过这一列,扫描方向:左
2.左下角元素:列数初始值为0,行数初始值为array.size()-1
目标值>左下角元素:即大于其所在列的所有元素,所以我们可以列数++,即跳过这一列,扫描方向为:右
目标值<左下角元素:即小于其所在行的所有元素,所以我们可以行数 - -,即跳过这一行,扫描方向为:上
代码如下:
右上角
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
//
int rows = array.size();
if (rows == 0)
return false;
int cols = array[0].size();
if (cols == 0)
return false;
int i = 0;
int j = cols - 1;
//循环条件
while (i != rows && j>=0)
{
//判断相等
if(target == array[i][j])
return true;
else if (target > array[i][j])
i++;
else
j--;
}
return false;
}
};左下角
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
//
int rows = array.size();
if (rows == 0)
return false;
int cols = array[0].size();
if (cols == 0)
return false;
//取左下角元素
int i = rows-1;
int j = 0;
//循环条件,从左下角开始判断
while (i>=0 && j!=cols)
{
//判断相等
if(target == array[i][j])
return true;
else if (target > array[i][j])
j++;
else
i--;
}
return false;
}
};