LeetCode 74 | 搜索二维矩阵(C语言版题解)

题目描述

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

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

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

给你一个整数 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 == matrix[i].length

  • 1 <= m, n <= 100

  • -10^4 <= matrix[i][j], target <= 10^4


解题思路

题目给的两个条件说明了 矩阵可以看成一个整体递增的数组

  1. 每行递增

  2. 下一行的第一个元素大于上一行最后一个元素

举例:

复制代码
1   3   5   7
10 11 16  20
23 30 34  60

实际上等价于:

复制代码
[1,3,5,7,10,11,16,20,23,30,34,60]

因此我们可以直接对这个"虚拟的一维数组"进行 二分查找


下标转换公式

假设一维数组下标为 mid,对应二维矩阵下标为:

复制代码
row = mid / n;
col = mid % n;

其中 n 为矩阵的列数。


C语言实现

复制代码
#include <stdbool.h>

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
    int m = matrixSize;
    int n = matrixColSize[0];

    int left = 0;
    int right = m * n - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;
        int row = mid / n;
        int col = mid % n;

        int val = matrix[row][col];

        if (val == target) {
            return true;
        } else if (val < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return false;
}

复杂度分析

  • 时间复杂度:O(log(m*n))

  • 空间复杂度:O(1)


拓展

  1. 两次二分法:先在每一行的首元素中找出目标可能在哪一行,再在该行二分查找,复杂度为 O(log m + log n)。

  2. LeetCode 240 搜索二维矩阵 II:矩阵只保证行、列递增,推荐从右上角或左下角开始搜索。

  3. LeetCode 378 有序矩阵第 K 小元素:可以用二分查找答案或最小堆。

相关推荐
阳明山水2 分钟前
概念漂移分类与自适应策略解析
人工智能·深度学习·算法·机器学习·架构
独立开发之道3 分钟前
【three.js教程】Three.js 矩阵变换:position/quaternion/scale 和 matrix 到底怎么配合
开发语言·javascript·矩阵
纪念 2294 分钟前
数据结构排序(四)
开发语言·数据结构
OPEN-F7 分钟前
C++工程化:编译链接、调试与性能优化
开发语言·c++
欧特克_Glodon16 分钟前
OpenCV计算机视觉开发入门与实践<二十九>:grabCut算法分割图像
opencv·算法·计算机视觉·图像分割·grabcut 算法
邪修king29 分钟前
Re:Linux 系统篇(十七):进程篇(六):环境变量深度解析|命令行参数、环境变量表、4 种获取方式与继承机制万字详解
linux·服务器·c++
方方洛1 小时前
vllm教程-02-核心原理
人工智能·算法·vllm
张小姐的猫1 小时前
【C++开发脚手架】 —— Jsoncpp上手
java·linux·开发语言·网络·c++·tcp/ip·udp
小翰生信1 小时前
转录组下游分析全流程:DESeq2 差异分析、GO/KEGG 富集与 GSEA 实战
数据库·矩阵·golang
OPEN-F1 小时前
C++并发编程:异步任务与线程池实战
开发语言·c++·算法