晕晕乎乎的周一来上班了。
果然周一诸事不宜,撸一个剑指offer浑浑噩噩的两个小时,晕。
晕晕乎乎写的代码,遇到二维数组不知道啥是行啥是列。二维数组都排好序了,查找还是挺容易的,就是一定要注意边界,边界,界。
首先我们选择一个起点,起点很重要,因为是二维涉及到搜索方向的问题,所以我们要找一个合适的起始点。来看看四个顶点哪个合适。
1)第一个点是0,0如果我们遇到target比这个点大,往下或者右均可。同理,右下的顶点是,找小的,往上往左。
2)第二个点是size()-1,0(-1,-1,-1)一定要减一,如果target大了,往右,如果小了,往上。同理,右上的点是大了往下,小了往左。
现在看起来好像第二类点更适合,因为方向唯一,看起来好像搜索的次数少了一些。随便选择一个起始搜索点,选了左下(事实上的确是少了一半左右)
然后我们先判断边界,搜索停止条件,本人著名的错误出现了
i=0;
j=array.size(); //表示vector的行数
while(j<0||i>array[0].size())
这么写边界就蠢死了,把终止条件写成了运行条件,后果是直接跳出。
正确的边界是 while(j>=0&&i<array[0].size())
完整的代码
#include<vector>
#include<iostream>
using namespace std;
bool Find(int target, vector< vector<int> > array){
int i,j;
i=0;
j=array.size()-1; //表示vector的行数
while(j>=0&&i<array[0].size()){
// if(j<0||i>array[0].size()) break;
if(array[j][i]>target) j--;
else if(array[j][i]<target) i++;
else return true;
}
return false;
}
int main(int argc, char *argv[])
{ int b[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
vector< vector<int> > a(4,vector<int>(4));
for(int i = 0;i<4;++i){
for (int j = 0; j < 4; ++j){
a[i][j]=b[i][j];
}
}
cout<<Find(7,a);
return 0;
}
牛客上可以ac的
class Solution {
public:
bool Find(int target, vector< vector<int> > array){
int i,j;
i=0;
j=array.size()-1; //表示vector的行数
while(j>=0&&i<array[0].size()){
// if(j<0||i>array[0].size()) break;
if(array[j][i]>target) j--;
else if(array[j][i]<target) i++;
else return true;
}
return false;
}
};