剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找

难度中等

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

 

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

给定 target = 5,返回 true

给定 target = 20,返回 false

 

限制:

0 <= n <= 1000

0 <= m <= 1000

 

我的代码:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
    int bi=-1,bj=-1;
    int getBi(){
        return bi;
    }
    void setBi(int i){
        bi=i;
    }
    int getBj(){
        return bj;
    }
    void setBj(int j){
        bj=j;
    }
public:
    bool f(vector<vector<int>>& matrix, int target,int fi,int fj){
        bool r=false;
        if(matrix[fi][fj]>target){
            if(((fi-1)>getBi()||fj>getBj())&&fi>0){
                bool t=f(matrix,target,fi-1,fj);
                if(t)r=t;
            }
            if((fi>getBi()||(fj-1)>getBj())&&fj>0){
                bool t=f(matrix,target,fi,fj-1);
                if(t)r=t;
            }
        }else if(matrix[fi][fj]==target){
            r=true;
            //cout<<fi<<" "<<fj<<endl;//test
        }else if(matrix[fi][fj]<target){
            if(getBi()<fi)setBi(fi);
            if(getBj()<fj)setBj(fj);
        }
        //cout<<matrix[fi][fj]<<" "<<bi<<" "<<bj<<endl;//test
        return r;
    }
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        int fi,fj;
        if(matrix.size()<1||matrix[0].size()<1)return false;
        fi=matrix.size();
        fj=matrix[0].size();
        //cout<<fi<<" "<<fj<<endl;//test
        return f(matrix,target,fi-1,fj-1);
    }
};
int main(){
    Solution s;
    vector<vector<int>>matrix(6,vector<int>(5));
    matrix={{1,4,7,11,15},
            {2,5,8,12,19},
            {3,6,9,16,22},
            {10,13,14,17,24},
            {18,21,23,26,30},
            {19,20,24,27,31}
            };
    if(s.findNumberIn2DArray(matrix,16))cout<<"存在!"<<endl;else cout<<"不存在!"<<endl;
    //cout<<"程序正常运行!"<<endl//test;
    return 0;
}
posted @ 2023-01-13 16:06  非遂爻辞  阅读(32)  评论(0)    收藏  举报