LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74_C++_中等)

LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74_C++_中等)

题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

输入输出样例:

示例 1:

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

示例 2:

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

提示:

m== matrix.length

n == matrixi.length

1 <= m, n <= 100

-104 <= matrixij, target <= 104

题解:

解题思路:

思路一(一次二分查找(将二维转换为一维)):

1、将二维数组看作是一维数组进行处理(运用 "/" 和 "%" 映射到一维)。
例:

按照一维 数组空间展开为:1,3,5,7,10,11,16,20,23,30,34,60
一维 :中间元素取11,其下标为 5
二维 :中间元素取11,其下标为 1,1

5/3(column_size)=1(行)

5%4(column_size)=1(列)
一维和二维的对应关系为:

一维元素的下标 / 矩阵列数 = 二维元素的行下标

一维元素的下标 % 矩阵列数 = 二维元素的列下标

2、复杂度分析:

① 时间复杂度:O(logmn),其中m和n分别是矩阵的行数和列数。

② 空间复杂度:O(1)。

代码实现

代码实现(思路一(一次二分查找(将二维转换为一维))):
cpp 复制代码
class Solution {
public:
    // 函数名称:searchMatrix
    // 输入参数:一个二维矩阵matrix和一个整数target
    // 返回值:如果target在矩阵中,则返回true;否则返回false
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        // 获取矩阵的列数
        int col_size = matrix[0].size();
        // 获取矩阵的行数
        int row_size = matrix.size();
        
        // 定义二分查找的左右边界
        int left = 0;
        int right = col_size * row_size - 1; // 一维化后最后一个元素的索引

        // 二分查找循环
        while (left <= right) {
            // 计算中间索引
            int mid = (left + right) / 2;
            // 将一维索引mid转换为二维坐标(行和列)
            int x = mid / col_size;  // 计算当前mid对应的行索引
            int y = mid % col_size;   // 计算当前mid对应的列索引
            
            // 进行比较
            if (matrix[x][y] < target) {
                // 如果当前值小于目标值,移动左边界到 mid + 1
                left = mid + 1;
            } else if (matrix[x][y] > target) {
                // 如果当前值大于目标值,移动右边界到 mid - 1
                right = mid - 1;
            } else {
                // 找到目标值,返回true
                return true;
            }
        }
        // 未找到目标值,返回false
        return false;
    }
};
以思路一为例进行调试
cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    // 函数名称:searchMatrix
    // 输入参数:一个二维矩阵matrix和一个整数target
    // 返回值:如果target在矩阵中,则返回true;否则返回false
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        // 获取矩阵的列数
        int col_size = matrix[0].size();
        // 获取矩阵的行数
        int row_size = matrix.size();
        
        // 定义二分查找的左右边界
        int left = 0;
        int right = col_size * row_size - 1; // 一维化后最后一个元素的索引

        // 二分查找循环
        while (left <= right) {
            // 计算中间索引
            int mid = (left + right) / 2;
            // 将一维索引mid转换为二维坐标(行和列)
            int x = mid / col_size;  // 计算当前mid对应的行索引
            int y = mid % col_size;   // 计算当前mid对应的列索引
            
            // 进行比较
            if (matrix[x][y] < target) {
                // 如果当前值小于目标值,移动左边界到 mid + 1
                left = mid + 1;
            } else if (matrix[x][y] > target) {
                // 如果当前值大于目标值,移动右边界到 mid - 1
                right = mid - 1;
            } else {
                // 找到目标值,返回true
                return true;
            }
        }
        // 未找到目标值,返回false
        return false;
    }
};

int main(){
    vector<vector<int>> matrix={{1,3,5,7},{10,11,16,20},{23,30,34,60}};
    int target=3;

    Solution s;
    if (s.searchMatrix(matrix,target))
    {
        cout<<"true";
    }else{
        cout<<"false";
    }
    
    return 0;
}

LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74)原题链接

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
黄敬峰14 小时前
Agent Memory 进阶:用 LLM 总结压缩上下文,告别"金鱼记忆"
面试
Tisfy14 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
RisunJan16 小时前
后端高频面试题与解答
面试·职场和发展
木井巳17 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
Navigator_Z18 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z18 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
数智启示录20 小时前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试
智购无人售货机厂家21 小时前
2026自动售货机软硬件版本管理策略:从版本号规范到兼容性矩阵的工程实践~YH
运维·服务器·人工智能·单片机·嵌入式硬件·线性代数·矩阵
CoderYanger1 天前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
windliang1 天前
Agent Loop 的 while 循环什么时候开始不够用
人工智能·面试·开源