74. Search a 2D Matrix(搜索二维矩阵)解法(C++ & 注释)

1. 题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:
matrix =
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true

示例 2:

输入:
matrix =
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false

题目链接:中文题目英文题目

2. 二分查找(Binary Search)

2.1 解题思路

说实话这道题有点难以相信是medium难度的…,放在easy里面应该也不算太难。不过我们也不要大意,争取一次accepted吧~ 这道题主要有两种思路吧:1)二分查找;2)双指针。

这里讲解一下主要的思路,代码用的是二分查找,至于双指针的思路和方法,大家可以参考这篇文章:33. Search in Rotated Sorted Array(搜索旋转排序数组)两种解法(C++ & 注释)

针对这道题,我们只需转换一下思路就可以了。如果是一维数组进行查找,直接用二分或双指针,现在我们以列数(matrix[0].size())对一维数组进行分割,然后查找,所以第一步,我们需要找到在哪一组进行二分查找。

因此,可以直接查找第一个比targe大的分组,即matrix[i][0] > target,那么我们需要第i - 1个组进行二分查找target;另外,需要注意一种特殊情况:

  1. [[1,2,3,4]], target >= 1
  2. [[1,2,3,4],[5,6,7,9]], target >= 5

上面两个例子,我们发现如果查找的target属于最后一个分组,或者大于最后一个分组,那么按照上述方法的思路是找不到第一个比target大的分组,这种情况可以查找最后一个分组,看target是否包含在最后一个分组里面。

2.2 实例代码

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (!matrix.size() || !matrix[0].size()) return false;
        int rows = matrix.size(), columns = matrix[0].size(), rowsIdx = -1;
        
        for (int i = 0; i < rows; i++) if (matrix[i][0] > target) { rowsIdx = i - 1; break; }
        
        return rowsIdx == -1 ? binary_search(matrix[rows - 1].begin(), matrix[rows - 1].end(), target) : binary_search(matrix[rowsIdx].begin(), matrix[rowsIdx].end(), target);
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值