【剑指Offer-数组】面试题4:二维数组中的查找

题目描述

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

思路1

从右上角或者左下角一步一步缩小比较范围。假如从右上角开始,设当前数字(右上角)为cur,要查找的数字为target。如果cur==target,则查找成功;如果cur>target,因为数组中的元素从上到下递增排序,所以当前元素cur所在的这一列就不用比较了(该列元素>=cur>target),将当前元素cur所在列删除;如果cur<target,因为数组元素从左到右递增,则当前元素cur所在的这一行就不用比较了(该行元素<=cur<target),将将当前元素cur所在行删除。更新当前元素cur为查找范围修改后右上角的元素,重复前面的过程,直至查找范围为空。

代码如下:

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.empty() || matrix[0].empty()) return false;
        
        int rows = matrix.size();
        int cols = matrix[0].size();
        int r = 0;
        int c = cols-1;
        while(r<rows && c>=0){
            if(matrix[r][c]==target) return true;
            else if(matrix[r][c]>target){
                c--;
            }else if(matrix[r][c]<target){
                r++;
            }
        }
        return false;
    }
};

思路2

思路 1 是根据当前的位置是否超过的数组的范围来进行循环的,还可以通过是否找到 target 来进行循环。代码如下:

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.empty() || matrix[0].empty()) return false;

        int rows = matrix.size();
        int cols = matrix[0].size();
        int r = 0;
        int c = cols-1;
        while(true){ // 这里使用 while(true)
            if(matrix[r][c]==target) return true;
            else if(matrix[r][c]>target){
                c--;
                if(c<0) return false;
            }
            else if(matrix[r][c]<target){
                r++;
                if(r>=rows) return false;
            }
        }
        return false;
    }
};
posted @ 2020-01-07 16:54  Flix  阅读(219)  评论(0编辑  收藏  举报