剑指offer:二维数组中的查找

参考:http://www.07net01.com/2015/07/874135.html

描述

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

解法

这是一道考查二维数组的理解和编程能力的题。

在二维数组在内存中是连续存储的。在内存中从上到下存储各行元素,在同一行中按照从左到右存储。

因此可以按照行号和列号来计算出相对数组首部的位置。

由于每一行 和 每一列都是有序的,因此,我们可以拿要查找的数与数组的右上角的数进行比较。

因为每一行从左到右递增,每一列从上到下递增。
所以查找一个数num,可以这样做:
首先拿num与右上角的数进行比较。
若相等,则直接返回,找到该数。
若num < 右上角数,则剔除右上角数所在列 col–
若num > 右上角数,则剔除右上角数所在行 row++

有了这个思路,我们就可以进行写代码了。

其实,还可以选择与左下角的数进行比较。方法与上述跟右上角数比较一样。

code

class Solution {
public:
    bool Find(vector<vector<int> > array,int target) {
        bool found = false;
        int row = array.size();
        int col = array[0].size();

        if(!array.empty() && row > 0 && col > 0){

            int crow = 0, ccol = col - 1;

            while(crow < row && ccol >= 0){
                if(array[crow][ccol] == target){
                    return true;
                }
                else if(array[crow][ccol] > target)
                    --ccol;
                else
                    ++crow;
            }
        }
        return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章