剑指 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;
}

浙公网安备 33010602011771号