《剑指offer》学习笔记_面试题4_二维数组中的查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/82345922
  • 题目描述

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

  • 思路

        对于二维数组,搜索的起点可能有四个位置,分布对应矩形的四个角。对于左上角来说,当前位置为最小值,如果要搜索的数大于该值,那么搜索方向可以是右边、也可以是下边,也就是说有两个搜索方向。同理,对于右下角来说也有两个搜索的方向。

再来看右上角,如果要搜索的数大于当前值,那么应该向下搜索;如果要搜索的数小于当前值,那么应该向左搜索,因此搜索方法可以唯一的确定。同理,对于左下角来说也能唯一确定一个搜索方向。综上,应该选择从右上角或左下角开始搜索

  • C++实现


/*《剑指offer》面试题4:二维数组中的查找*/

#include <iostream>
#include <vector>

using namespace std;

/*二维数组版本*/
bool Find2(vector<vector<int> >& matrix,int num){
    int rows = matrix.size();
    int columns = matrix.size();
    if(rows==0||columns==0)
        return false;
    int r = 0,c = columns - 1;
    while(r<rows&&c>=0){
        if(matrix[r][c]==num)
            return true;
        else if(matrix[r][c]>num)
            c--;
        else
            r++;
    }
    return false;
}

//一维数组版本
bool Find1(vector<int>& matrix,int rows,int columns,int num){
    if(matrix.size()==0||rows<1||columns<1)
        return false;
    int r = 0,c = columns-1;
    while(r<rows&&c>=0){
        if(matrix[r*columns+c]==num)
            return true;
        else if(matrix[r*columns+c]>num)
            c--;
        else
            r++;
    }
    return false;
}

int main(){
    int rows = 4,columns = 4;
    int a[16] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
    //一维数组测试
    vector<int> A(a,a+sizeof(a)/sizeof(int));
    cout<<Find1(A,4,4,7);
    //二维数组测试
    /*vector<vector<int> > A(rows,vector<int>(columns));
    for(int i=0;i<16;i++)
        A[i/4][i%4] = a[i];
    cout<<Find2(A,7);*/
}
  • 时间复杂度

        最坏情况下的时间复杂度为O(m+n),其中m、n是数组的行数和列数。

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/82345922