题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的一个二维数组和一个正数,判断数组中是否含有该正数。
输入描述:
array: 待查找的二维数组
target: 查找的数字
输出描述:
查找到返回true,查找不到返回false
遍历查找显然不是我们期望的结果。题意描述的二维数组的排列规则,应该引起我们的注意。
当二维数组中的某个元素与target比较时,只存在三种情况,相等,大于,小于。
相等直接返回true即可;当当前元素的值大于或者小于target的值,我们需要明确定位下一个同target比较的元素的位置。
二维数组的四个角上的元素是我们的突破口。
似乎我们总是忍不住首先考虑数组的第一个(左上角)元素。但是,马上我们就能找到从左上角元素开始查找不合适的理由。
当第一个元素和target比较之后,如果不幸二者不相等,接下来的问题就是,我们无法确定下个和target比较的是哪个元素。因为,无论第一个元素的右边还是下面的元旦都比第一个元素大。
右下角的元素存在同样问题。
依照这种思路,我们不能发现,左下角和右上角的元素存在一个共同特点:
当target大于当前元素的值时,下一个需要和target比较的元素必在当前元素的下方;
当target小于当前元素的值是,下一个需要和target比较的元素必在当前元旦是左方。
那为什么不从左下角或右上角元素开始呢?
参考代码:
从右上角元素开始
class Solution { public: bool Find(vector<vector<int> > array,int target) { int rows = array.size(); int cols = array[0].size(); int row = 0, col = cols-1; while(row < rows && col >= 0){ if(array[row][col] == target) return true; else if(array[row][col] > target) --col; else ++row; } return false; } };
从左下角元素开始
class Solution { public: bool Find(vector<vector<int> > array,int target) { int rows = array.size(); int cols = array[0].size(); int row = rows-1, col = 0; while(row >= 0 && col < cols){ if(array[row][col] == target) return true; else if(array[row][col] > target) --row; else ++col; } return false; } };
原文:http://www.cnblogs.com/swang93/p/5066933.html