首页 > 代码库 > 剑指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 学习笔记