剑指offer——二维数组中的查找
二维数组中的查找
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&&tqId=11154&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
![题目:二维数组中的查找](https://uploadfiles.nowcoder.com/images/20200602/230393819_1591110986786_4BB6110CB25F5AA2574329A1F1B9F8DF "图片标题")
解题思想:
由题目可得,其每一行从左到右依次递增,最右元素为行最大,其每一列从上到下依次递增,最下元素为列最大,所以在比较的时候
我们可以使用类二分思想,从一个较大元素开始判断,即从右上角和左下角的元素开始判断
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; } };