leetcode.74:搜索二维矩阵

简介: leetcode.74:搜索二维矩阵

题目描述:


编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
·每行中的整数从左到右按升序排列。
·每行的第一个整数大于前一行的最后一个整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


示例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


题目难度:中等


分析:


典型的二分算法,只不过普通的是一维数组,这个是二维数组。但是算法逻辑一样。代码如下:


java:


class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0) {
            return false;
        }
        // 行
        int m = matrix.length;
        // 列
        int n = matrix[0].length;
        int left = 0;
        int right = m * n - 1;
        int index = 0;
        int element = 0;
        while (left <= right) {
            index = (left + right) / 2;
            // 如果把二维数组捋直,选取其中一个元素的下标作为index
            // 那么此元素在二维数组中可如下表示:
            element = matrix[index / n][index % n];
            if (element == target) {
                return true;
            } else if (element > target) {
                right = index - 1;
            } else {
                left = index + 1;
            }
        }
        return false;
    }
}


python:


class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if len(matrix) == 0:
            return False
        m, n, index, element= len(matrix), len(matrix[0]), 0, 0
        left, right = 0, m * n - 1
        while left <= right:
            index = (left + right) // 2
            element = matrix[index // n][index % n]
            if element == target:
                return True
            elif element > target:
                right = index - 1
            else:
                left = index + 1
        return False


总结:

时间复杂度为:O(log(mn))。

目录
相关文章
|
4天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4天前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵
|
4天前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
4天前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
14天前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
18 4
|
15天前
|
算法 Python
【Leetcode刷题Python】74. 搜索二维矩阵
两种解决LeetCode "搜索二维矩阵" 问题的方法的Python实现。第一种方法是从二维矩阵的右上角开始线性搜索,通过比较当前元素与目标值来决定搜索方向。第二种方法是将二维矩阵视为一维数组进行二分查找,通过计算中间元素的行列索引来更新搜索区间。两种方法都旨在高效地判断目标值是否存在于给定的有序二维矩阵中。
11 0
|
15天前
|
算法 索引 Python
【Leetcode刷题Python】33. 搜索旋转排序数组
解决LeetCode "搜索旋转排序数组" 问题的Python实现代码。代码使用了二分查找算法,首先检查目标值是否存在于数组中,然后通过比较数组中间值与数组首尾值来确定应该在数组的哪一半继续搜索,直到找到目标值或搜索范围为空。如果找到目标值,返回其索引;如果搜索结束仍未找到,返回 -1。
10 0
|
15天前
|
索引 Python
【Leetcode刷题Python】35. 搜索插入位置
解决在排序数组中查找目标值并返回其索引或插入位置的问题的Python实现代码。
10 0
|
2月前
力扣每日一题 6/11 暴力搜索
力扣每日一题 6/11 暴力搜索
12 0
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
28 6