[剑指Offer]:二维数组中的查找(杨氏矩阵)

140 阅读1分钟

文章目录


题目描述

在一个二维数组中,每一行都按照从左向右递增,每一列从上到下递增的顺序排列。输入一个这样的二维数组和一个整数,并判断数组中是否含有该整数。

例如:

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

代码生成图:

在这里插入图片描述


如有不同见解,欢迎留言讨论~~~