Leetcode 240. Search a 2D Matrix II (python+cpp)

本文介绍了LeetCode 240题的两种独特解法,包括按行二分搜索和O(m+n)时间复杂度的右上角搜索策略。虽然C++实现的按行二分搜索未能通过,但Python代码显示两种方法效率相近。右上角搜索被认为是最佳O(m+n)解法。
摘要由CSDN通过智能技术生成

Leetcode 240. Search a 2D Matrix II

题目

在这里插入图片描述

这道题目有很多不同的解法,我这边的两种是leetcode官方解答中没有出现的,个人认为这两种方法比较直观也在面试中容易想到

解法1:按行二分搜索

由于每一行每一列都是排好序的,所以可以按行或者按列进行二分搜索,时间复杂度为O(mlog(n))或者O(nlog(m)),这边下面写了按行二分的方法,按列也一样

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        def binary_search(row):
            l,h = 0,n-1
            while l<=h:
                mid = l+(h-l)//2
                if matrix[row][mid] == target:
                    return True
                elif matrix[row][mid] > target:
                    h = mid-1
                else:
                    l = mid+1
            return False
        if not matrix or not matrix[0]:
            return False
        m = len(matrix)
        n = len(matrix[0])
        for i in range(m):
            if binary_search(i):
                return True
        return False

C++版本代码如下:
C++这种解法居然没过!!!很神奇,因为python提交的结果第一种解法和第二种解法的时间几乎是一致的。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty()){
            return false;
        }
        int m = matrix.size(), n = matrix[0].size();
        for (int i=0;i<m;i++){
            if (binary_search(matrix[i],n,target)) return true;
        }
        return false;
    }
    bool binary_search(vector<int> row, int n, int target){
        int l = 0, h = n-1;
        while (l<=h){
            int mid = l+(h-l)/2;
            if (row[mid] == target){
                return true;
            }else if (row[mid]>target){
                h = mid-1;
            }else{
                l = mid+1;
            }
        }
        return false;
    }
};

解法2:O(m+n)

这道题有一个简单的技巧:我们可以从右上角开始查找,若当前值大于待搜索值,我们向左 移动一位;若当前值小于待搜索值,我们向下移动一位。如果最终移动到左下角时仍不等于待搜 索值,则说明待搜索值不存在于矩阵中。这种方法复杂度为O(m+n)应该是最优解法,但是没体现二分查找的思想是真的

python代码如下:

class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if not matrix or not matrix[0]:
            return False
        m,n = len(matrix),len(matrix[0])
        i,j = 0,n-1
        while i<m and j>=0:
            if matrix[i][j] > target:
                j -= 1
            elif matrix[i][j]<target:
                i += 1
            else:
                return True
        return False

C++版本如下:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty()){
            return false;
        }
        int m = matrix.size(), n = matrix[0].size();
        int i = 0, j = n-1;
        while (i<m and j>=0){
            if (matrix[i][j]>target){
                j--;
            }else if (matrix[i][j]<target){
                i++;
            }else return true;
        }
        return false;
    }
    
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值