首页 > 编程语言 > 详细

二维数组中的查找

时间:2015-12-22 17:47:48      阅读:288      评论:0      收藏:0      [点我收藏+]

题目描述:

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

 

输入描述:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!