数据结构与算法-22.搜索二维矩阵 II

1、搜索二维矩阵 II

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jzm9GZLA-1637301254547)(image-20211119134229421.png)]

1.0、暴力解法

直接遍历整个二维数组,看一下有没有目标数

bool searchMatrix0(vector<vector<int>>& matrix, int target)
{
    for (auto& i : matrix)
        for (auto& j : i)
            if (j == target)return true;
    return false;
}

时间复杂度:O(m n)m是行数,n是列数

空间复杂度:O(1)

1.1、对每一行(或列)进行二分查找

就是对每一行进行二分查找看看有没有目标数,有的话就返回true,没有就继续找下一行

bool searchMatrix1(vector<vector<int>>& matrix, int target)
{
    for (auto& i : matrix)
    {
        int leftIndex = 0, rightIndex = i.size() - 1;
        while (leftIndex <= rightIndex)
        {
            int midIndex = (leftIndex + rightIndex) / 2;
            if (i[midIndex] == target)return true;
            else if (i[midIndex] < target)leftIndex = midIndex + 1;
            else rightIndex = midIndex - 1;
        }
    }
    return false;
}

时间复杂度:O(m log n)每一行二分查找的开销是log n

空间复杂度:O(1)

1.2、Z字型查找

对于数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhtqIgCg-1637301254550)(image-20211119134650427.png)]

我们设定【0,4】到【4,0】的矩形内为查找范围

假设需要查找14,步骤如下:

  • 【0,4】> 14,则4减一为3,因为第四列全部数都比14大
  • 【0,3】 < 14,则0加一为1,因为第零行全部数都比14小
  • 【1,3】 < 14,则1加一为2,因为第一行全部数都比14小
  • 【2,3】 > 14,则3减一为2,因为第三列全部数都比14大
  • 【2,3】 < 14,则2加一为3,因为第二行全部数都比14小
  • 【3,4】 = 14,返回true
  • 若row或者col超出边界,则返回false
bool searchMatrix2(vector<vector<int>>& matrix, int target)
{
    int rowIndex = 0, colIndex = matrix[0].size() - 1;
    while (rowIndex < matrix.size() && colIndex >= 0)
    {
        if (matrix[rowIndex][colIndex] == target)return true;
        else if (matrix[rowIndex][colIndex] > target)colIndex--;
        else rowIndex++;
    }
    return false;
}

时间复杂度:O(m + n)最坏情况是target在左下角,从右上角到左下需要向下走m行,向左走n列
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值