LeetCode 240. 搜索二维矩阵 II

原题链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题面:

编写一个高效的算法来搜索 m xn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

复制代码
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

解题思路:

可以很容易想到,当数组中选取的数字小于要查找的数字,则根据该题二维数组的排序规则,我们要找的数字可能在当前选取位置的右边或者下边,同理,如果选取的数字大于要查找的数字,那么要查找的数字可能在当前选取位置的左边或者上边。

在以上分析中,由于要查找的数字相对于选取位置有可能在两个区域中出现,并且这两个区域还存在重叠,所以单纯的用这个规律进行搜索似乎是不太可行的,并不能十分有效的提高搜索效率。

我们考虑从右上角开始搜索,如果该数字等于要查找的数字,则结束查找。如果该数字大于要查找的数字,则这一列都不可能符合,所以排除这一列。如果该数字小于要查找的数字,那么按照规律我们应该往右或者往下,但是右边的列是已经被我们排除过的,所以往下,即将当前行也排除掉了。这样每一步都可以缩小查找的范围,直到找到要查找的数字或者查找范围为空。

时间复杂度为O(m+n),m为矩阵行数,n为矩阵列数。

空间复杂度为O(1)。

代码(C):

cpp 复制代码
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int m = matrixSize;
    int n = *matrixColSize;
    int row = 0;
    int col = n - 1;
    while (row < m && col >= 0) {
        if (matrix[row][col] == target) {
            return true;
        }
        if (matrix[row][col] > target) {
            col--;
        } else {
            row++;
        }
    }
    return false;
}
相关推荐
happyprince1 分钟前
01-整体观-Codex全貌解读(源码)
算法·ai编程
俊基科技23 分钟前
别自己写算法了,让这颗37.5毫米的模组替你“闭嘴干活”
神经网络·算法·硬件开发·ai降噪·语音模块·回音消除
_Narcissus_1 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
世人万千丶1 小时前
鸿蒙项目实战 - 社区活动编排板:标签云布局算法与自动换行
学习·算法·华为·harmonyos·鸿蒙
zander2581 小时前
LeetCode 279. 完全平方数
算法·深度优先
典典分享指南2 小时前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
_Narcissus_3 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
天疆说3 小时前
策略的进化:从随心所欲到稳健前行
算法
冻柠檬飞冰走茶3 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list