[剑指offer]JZ1 二维数组中的查找

题目链接:二位数组中的查找

[剑指offer]JZ1 二维数组中的查找_第1张图片

第一种解法:暴力搜索
没什么好讲的,遍历就完事了,注意判空
时间复杂度:O(n^2)
空间复杂度:O(1)

//暴力算法:时间:O(n^2)   空间:O(1)
class Solution {
     
public:
    bool Find(int target, vector<vector<int> > array) {
     
        if(array.size()==0||array[0].size()==0)
            return false;
        for(const auto& vec:array)
        {
     
            for(const int val:vec)
            {
     
                if(val==target)
                    return true;
            }
        }
        return false;
    }
};

第二种解法:二分法
时间复杂度:O(m+n) m和n是二位数组的行和列
空间复杂度:O(1)

题目给出数组特征:每行按照从左到右的顺序递增,每列按照从上到下的顺序递增
那么我们就可以找出二分法的中值:左下角或者右上角的值。

以右上角的值为例,同一行左边的值都比他小,同一列下边的值都比他大
[剑指offer]JZ1 二维数组中的查找_第2张图片

具体步骤:
[剑指offer]JZ1 二维数组中的查找_第3张图片

class Solution {
     
public:
    bool Find(int target, vector<vector<int> > array) {
     
    if(array.size()==0||array[0].size()==0)
        return false;
        int m=array.size();        //数组的行
        int n=array[0].size();     //数组的列
        //二分法
        int r=0,c=n-1;        //右上角的元素
        while(r<m&&c>=0)
        {
     
            if(target==array[r][c])
                return true;
            else if(target<array[r][c])
                c--;
            else 
                r++;
        }
        return false;
    }
};

你可能感兴趣的:(习题,算法,二分法,数据结构)