首页 > 代码库 > 剑指offer 学习笔记

剑指offer 学习笔记

主题:二维数组中的查找

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

思路分析:首先分析题目描述,二维数组行递增,列递增,这种特性不同于混乱无序的数组查找,因此排除在数组中逐个查找目标元素的做法。

                  1   2   8     9

                  2   4   9    12

                  4   7   10  13

                  6   8   11  15

                  考虑从左上角开始查找,这个元素是整个数组中最小的元素。那么如果待查找元素比第一个元素大,那么,是该继续在该行查找还是换行查找是不确定的,

           因此从左上角开始查找的做法排除。从右下角开始查找也同理排除。

                  1   2   8     9

                  2   4   9    12

                  4   7   10  13

                  6   8   11  15

                  考虑从右上角元素开始查找,当目标元素比当前元素小时,我们就可以根据数组每列的递增特性将此列排除,即列数往左移动(col-1);当目标元素大于当前

          元素时,根据每行递增的特性可以将当前行排除,即查找下一行(row+1),当前元素等于待查找元素时,表示查找到目标元素,直接返回。因为是判断当前数组中

         知否含有目标元素而不需要统计个数,因此不需要考虑存在多个目标元素的情况。从右下角查找同理。

要点选好开始比较的位置(左下角或右上角),每次比较可以排除一行或一列,缩短查找的时间。

代码实现:

 1 class Solution {
 2 public:
 3     bool Find(int target, vector<vector<int> > array) {
 4         if (!array.empty())
 5         {
 6             int row = array.size();//行数
 7             int col = array[0].size();//列数
 8             //从左上角开始查找
 9             for (int i = 0,j = col-1; i < row && j >= 0; )
10             {
11                 if (target == array[i][j])
12                     return true;
13                 else if(target > array[i][j])
14                     i++;
15                 else
16                     j--;
17             }
18         }
19         return false;
20     }
21 };

 

 

 

 

 

         

剑指offer 学习笔记