zoukankan      html  css  js  c++  java
  • LeetCode(74):搜索二维矩阵

    Medium!

    题目描述:

    编写一个高效的算法来判断 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

    解题思路:

    这道题要求搜索一个二维矩阵,由于给的矩阵是有序的,所以很自然的想到要用二分查找法,我们可以在第一列上先用一次二分查找法找到目标值所在的行的位置,然后在该行上再用一次二分查找法来找是否存在目标值。

    C++解法一:

     1 // Two binary search
     2 class Solution {
     3 public:
     4     bool searchMatrix(vector<vector<int> > &matrix, int target) {
     5         if (matrix.empty() || matrix[0].empty()) return false;
     6         if (target < matrix[0][0] || target > matrix.back().back()) return false;
     7         int left = 0, right = matrix.size() - 1;
     8         while (left <= right) {
     9             int mid = (left + right) / 2;
    10             if (matrix[mid][0] == target) return true;
    11             else if (matrix[mid][0] < target) left = mid + 1;
    12             else right = mid - 1;
    13         }
    14         int tmp = right;
    15         left = 0;
    16         right = matrix[tmp].size() - 1;
    17         while (left <= right) {
    18             int mid = (left + right) / 2;
    19             if (matrix[tmp][mid] == target) return true;
    20             else if (matrix[tmp][mid] < target) left = mid + 1;
    21             else right = mid - 1;
    22         }
    23         return false;
    24     }
    25 };

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

    C++解法二:

     1 // One binary search
     2 class Solution {
     3 public:
     4     bool searchMatrix(vector<vector<int> > &matrix, int target) {
     5         if (matrix.empty() || matrix[0].empty()) return false;
     6         if (target < matrix[0][0] || target > matrix.back().back()) return false;
     7         int m = matrix.size(), n = matrix[0].size();
     8         int left = 0, right = m * n - 1;
     9         while (left <= right) {
    10             int mid = (left + right) / 2;
    11             if (matrix[mid / n][mid % n] == target) return true;
    12             else if (matrix[mid / n][mid % n] < target) left = mid + 1;
    13             else right = mid - 1;
    14         }
    15         return false;
    16     }
    17 };
  • 相关阅读:
    基于ZKEACMS的.Net Core多租户CMS建站系统
    使用PowerShell自动部署ASP.NetCore程序到IIS
    在Linux安装ASP.Net Core的运行时(Runtime)
    ASP .Net Core 2.0 修改默认端口
    .Net Core内存回收模式及性能测试对比
    .Net Core配置与自动更新
    Razor TagHelper实现Markdown转HTML
    用Docker自动构建纸壳CMS
    纸壳CMS 2.3,正式加入商城功能
    Linux使用私钥公钥(Public key)登录
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9154254.html
Copyright © 2011-2022 走看看