文章目录
题目描述
在一个二维数组中,每一行都按照从左向右递增,每一列从上到下递增的顺序排列。输入一个这样的二维数组和一个整数,并判断数组中是否含有该整数。
例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果查找的数字是7,则返回true;
正确思路
- 首先选取数组中右上角的数字,如果该数字正好等于要查找的数字,则查找结束
- 如果该数字大于要查找的数字,则剔除这个数字所在的列
- 如果该数字小于要查找的数字,则剔除这个数字所在的行。
- 这样每次剔除一行或者一列,逐渐缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
代码如下:
bool Find(vector<vector<int> > vv, int n){
if(vv.empty()) return false;
int i = 0, j = vv[0].size()-1;
while(i < vv.size() && j >= 0){
if(vv[i][j] == n) return true;
else if(vv[i][j] > n) --j;
else if(vv[i][j] < n) ++i;
}
return false;
}
测试代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int arr[4][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
vector<vector<int> > vv(4, vector<int>(4));
for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) vv[i][j] = arr[i][j];
for(int i = 0; i < 4; ++i) {
for(int j = 0; j < 4; ++j) {
if(j == 0) cout << vv[i][j];
else cout << ' ' << vv[i][j];
}
cout << endl;
}
cout << "这个二维数组中是否有:" ;
int num;
cin >> num;
if(Find(vv, num)) cout << "数组中存在" << num << endl;
else cout << "数组中不存在" << num << endl;
return 0;
}
代码生成图:
如有不同见解,欢迎留言讨论~~~