C++实现LeetCode(74.搜索一个二维矩阵)

 更新时间:2021年07月17日 10:22:46   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(74.搜索一个二维矩阵),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 74. Search a 2D Matrix 搜索一个二维矩阵

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

Example 1:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true

Example 2:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: false

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

这道题要求搜索一个二维矩阵,由于给的矩阵是有序的,所以很自然的想到要用二分查找法,可以在第一列上先用一次二分查找法找到目标值所在的行的位置,然后在该行上再用一次二分查找法来找是否存在目标值。对于第一个二分查找,由于第一列的数中可能没有 target 值,该如何查找呢,如果是查找第一个不小于目标值的数,当 target 在第一列时,会返回 target 所在的行,但若 target 不在的话,有可能会返回下一行,不好统一。所以可以查找第一个大于目标值的数,也就是总结帖中的第三类,这样只要回退一个,就一定是 target 所在的行。但需要注意的一点是,如果返回的是0,就不能回退了,以免越界,记得要判断一下。找到了 target 所在的行数,就可以再次使用二分搜索,此时就是总结帖中的第一类了,查找和 target 值相同的数,也是最简单的一类,分分钟搞定即可,参见代码如下:

解法一:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int left = 0, right = matrix.size();
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[mid][0] == target) return true;
            if (matrix[mid][0] < target) left = mid + 1;
            else right = mid;
        }
        int tmp = (right > 0) ? (right - 1) : right;
        left = 0;
        right = matrix[tmp].size();
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[tmp][mid] == target) return true;
            if (matrix[tmp][mid] < target) left = mid + 1;
            else right = mid;
        }
        return false;
    }
};

当然这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组,可以得到一个有序的一维数组,只需要用一次二分查找法,而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点,把一个长度为n的一维数组转化为 m*n 的二维数组 (m*n = n)后,那么原一维数组中下标为i的元素将出现在二维数组中的 [i/n][i%n] 的位置,有了这一点,代码很好写出来了:

解法二:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int m = matrix.size(), n = matrix[0].size();
        int left = 0, right = m * n;
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[mid / n][mid % n] == target) return true;
            if (matrix[mid / n][mid % n] < target) left = mid + 1;
            else right = mid;
        }
        return false;
    }
};

这道题其实也可以不用二分搜索法,直接使用双指针也是可以的,i指向0,j指向列数,这样第一个被验证的数就是二维数组右上角的数字,假如这个数字等于 target,直接返回 true;若大于 target,说明要减小数字,则列数j自减1;若小于 target,说明要增加数字,行数i自增1。若 while 循环退出了还是没找到 target,直接返回 false 即可,参见代码如下:

解法三:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int i = 0, j = (int)matrix[0].size() - 1;
        while (i < matrix.size() && j >= 0) {
            if (matrix[i][j] == target) return true;
            else if (matrix[i][j] > target) --j;
            else ++i;
        }   
        return false;
    }
};

到此这篇关于C++实现LeetCode(74.搜索一个二维矩阵)的文章就介绍到这了,更多相关C++实现搜索一个二维矩阵内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言中的移位运算符

    c语言中的移位运算符

    这篇文章主要介绍了c语言中的移位运算符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++编程模板匹配超详细的识别手写数字实现示例

    C++编程模板匹配超详细的识别手写数字实现示例

    大家好!本篇文章是关于手写数字识别的,接下来我将在这里记录我的手写数字识别的从零到有,我在这里把我自己的写代码过程发出来,希望能帮到和我一样努力求知的人
    2021-10-10
  • C++超详细讲解智能指针

    C++超详细讲解智能指针

    为了解决内存泄漏的问题,C++中提出了智能指针。内存泄漏的产生原因有很多,即使我们正确的使用malloc和free关键字也有可能产生内存泄漏,如在malloc和free之间如果存在抛异常,那也会产生内存泄漏。这种问题被称为异常安全
    2022-06-06
  • C语言俄罗斯方块游戏课程设计

    C语言俄罗斯方块游戏课程设计

    这篇文章主要为大家详细介绍了C语言俄罗斯方块游戏课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++深入探究哈希表如何封装出unordered_set和unordered_map

    C++深入探究哈希表如何封装出unordered_set和unordered_map

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-06-06
  • boost.asio框架系列之buffer函数

    boost.asio框架系列之buffer函数

    这篇文章介绍了boost.asio框架系列之buffer函数,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++编程指向成员的指针以及this指针的基本使用指南

    C++编程指向成员的指针以及this指针的基本使用指南

    这篇文章主要介绍了C++编程指向成员的指针以及this指针的基本使用指南,与C语言一样,存储的数值被解释成为内存里的一个地址,需要的朋友可以参考下
    2016-01-01
  • C++ STL容器详解之红黑树部分模拟实现

    C++ STL容器详解之红黑树部分模拟实现

    本文主要对红黑树进行了详细介绍,并对其核心功能进行了模拟实现。文中的代码对我们的学习或工作有一定的价值,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C C++ 题解LeetCode1417重新格式化字符串

    C C++ 题解LeetCode1417重新格式化字符串

    这篇文章主要为大家介绍了C C++ 题解LeetCode1417重新格式化字符串,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 如何在c++中实现字符串分割函数split详解

    如何在c++中实现字符串分割函数split详解

    这篇文章主要给大家介绍了关于如何在c++中实现字符串分割函数split的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11

最新评论