• 力扣算法题—074搜索二维矩阵


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


     1 #include "_000库函数.h"
     2 
     3 
     4 //题目要求使用高效算法,但不知最高效的是哪个
     5 //本解法复杂度为m+n
     6 class Solution {
     7 public:
     8     bool searchMatrix(vector<vector<int>>& matrix, int target) {
     9         if (matrix.empty() || matrix[0].empty())return false;
    10         int m = matrix.size();
    11         int n = matrix[0].size();
    12         if (target< matrix[0][0] || target>matrix[m - 1][n - 1])return false;
    13         for (int i = 0; i < m; ++i)
    14             if (target >= matrix[i][0] && target <= matrix[i][n - 1]) {
    15                 for (int j = 0; j < n; ++j)
    16                     if (target == matrix[i][j])return true;
    17                 return false;
    18             }
    19         return false;
    20     }
    21 };
    22 
    23 //当然这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组,
    24 //可以得到一个有序的一维数组,那么我们只需要用一次二分查找法,
    25 //而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点,
    26 //把一个长度为n的一维数组转化为m*n的二维数组(m*n = n)后,
    27 //那么原一维数组中下标为i的元素将出现在二维数组中的[i / n][i%n]的位置,
    28 //
    29 
    30 // One binary search
    31 class Solution {
    32 public:
    33     bool searchMatrix(vector<vector<int> > &matrix, int target) {
    34         if (matrix.empty() || matrix[0].empty()) return false;
    35         if (target < matrix[0][0] || target > matrix.back().back()) return false;
    36         int m = matrix.size(), n = matrix[0].size();
    37         int left = 0, right = m * n - 1;
    38         while (left <= right) {
    39             int mid = (left + right) / 2;
    40             if (matrix[mid / n][mid % n] == target) return true;
    41             else if (matrix[mid / n][mid % n] < target) left = mid + 1;
    42             else right = mid - 1;
    43         }
    44         return false;
    45     }
    46 };
    47 
    48 void T074() {
    49     Solution s;
    50     vector<vector<int>>v;
    51     v = { {1,3,5,7},{10,11,16,20},{23,30,34,50} };
    52     cout << s.searchMatrix(v, 3) << endl;
    53     cout << s.searchMatrix(v, 13) << endl;
    54 
    55 
    56 }
  • 相关阅读:
    ueditor 后端配置项没有正常加载,上传插件不能正常使用 UTF8 PHP
    dedecms 后台栏目全部展开 包括三级栏目
    修改DedeCMS图片上传路径命名规则的具体方法步骤
    dedecms织梦副栏目名称和链接调用
    当位于顶级栏目显示下级栏目,当位于二级栏目显示同级栏目,当位于三级目录,显示上级栏目
    织梦多个栏目arclist调用副栏目不显示的解决办法
    PL/SQL连接64位Oracle配置方法
    U盘分区之后如何恢复
    Myeclipse 的使用随笔
    eclipse和myeclipse的差别问题
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10705619.html
Copyright © 2020-2023  润新知