力扣74. 搜索二维矩阵(二分查找)

Problem: 74. 搜索二维矩阵

文章目录

题目描述

思路

思路1:映射为一维数组二分查找

1.由于题目矩阵中的元素整体是升序的,我们可以将其放置在一个大小为 m × n m \times n m×n的一维数组array中进行二分查找

2.对应的映射关系是arraymid == marmid / nmid % n

思路2:直接在二维矩阵上进行二分查找

1.先对二维矩阵的第一列进行二分查找,找到小于等于target的一个数,讲此行标记为rowInd

2.从rowInd开始再进行二分查找

复杂度

思路1:

时间复杂度:

O ( l o g m n ) O(logmn) O(logmn)

空间复杂度:

O ( m n ) O(mn) O(mn)

思路2:

时间复杂度:

O ( l o g m n ) O(logmn) O(logmn)

空间复杂度:

O ( 1 ) O(1) O(1)

Code

思路1:

cpp 复制代码
class Solution {
public:
    /**
     * Binary Search
     * 
     * @param matrix Given array
     * @param target Given target number
     * @return bool
     */
    bool searchMatrix(vector<vector<int>> &matrix, int target) {
        int row = matrix.size();
        if (row == 0) {
            return false;
        }
        int col = matrix[0].size();
        int left = 0;
        int right = row * col - 1;
        vector<int> array(row * col);
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (matrix[mid / col][mid % col] == target) {
                return true;
            } else if (matrix[mid / col][mid % col] > target) {
                right = mid - 1;
            } else if (matrix[mid / col][mid % col] < target) {
                left = mid + 1;
            }
        }
        return false;
    }
};

思路2:

cpp 复制代码
class Solution {
 public:
     /**
      * Binary Search
      *
      * @param matrix Given array
      * @param target Given target number
      * @return bool
      */
     bool searchMatrix(vector<vector<int>>& matrix, int target) {
         int row = matrix.size();
         if (row == 0) {
             return false;
         }
         int col = matrix[0].size();
         int left = 0;
         int right = row - 1;
         while (left <= right) {
             int mid = left + (right - left) / 2;
             if (matrix[mid][0] == target) {
                 return true;
             } else if (matrix[mid][0] > target) {
                 right = mid - 1;
             } else if (matrix[mid][0] < target) {
                 left = mid + 1;
             }
         }
         // Check out of bounds
         if (right < 0) {
             return false;
         }
         int rowIdx = right;
         left = 0;
         right = col - 1;
         while (left <= right) {
             int mid = left + (right - left) / 2;
             if (matrix[rowIdx][mid] == target) {
                 return true;
             } else if (matrix[rowIdx][mid] > target) {
                 right = mid - 1;
             } else if (matrix[rowIdx][mid] < target) {
                 left = mid + 1;
             }
         }
         return false;
     }
 };
相关推荐
文丑颜不良啊2 小时前
LeetCode2861~2880题目解析
java·leetcode
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄2 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude20 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司20 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
文丑颜不良啊21 小时前
LeetCode2821~2840题目解析
java·leetcode
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀1 天前
背包DP(01背包+完全背包)
c++·算法