力扣刷题-热题100题-第21题(c++、python)

发布于:2025-03-22 ⋅ 阅读:(27) ⋅ 点赞:(0)

240. 搜索二维矩阵 II - 力扣(LeetCode)https://leetcode.cn/problems/search-a-2d-matrix-ii/submissions/613522892/?envType=study-plan-v2&envId=top-100-liked

逻辑法

看到题目第一眼,就想着从左往右,从上往下,只要找到对应的target的范围,以小于大于进行遍历的移动,但在写代码时发现比较难实现,边界情况没有右元素没有下元素,当右元素与下元素相等时等等,实现不太现实而且不一定遍历完全,但冥冥之中又感觉大方向没有问题 ,看了题解后醍醐灌顶,正向思考不太对,为何不反向思考,从右边遍历以排除法来排除元素!

以矩阵左下角与当前位置[x,y]构成矩阵,当[x,y]=target,找到了;当[x,y]<target,则往下走x+1;当[x,y]>target,则往左走,y-1。

//c++
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        int m=matrix.size(),n=matrix[0].size();
        int x=0,y=n-1;
        while(x<m&&y>=0)
        {
            if(matrix[x][y]==target)    return true;
            if(matrix[x][y]>target)    y--;
            else    x++;
        }
        return false;
    }
};

#python
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m,n=len(matrix),len(matrix[0])
        x,y=0,n-1
        while x<m and y>=0:
            if matrix[x][y]==target:
                return True
            if matrix[x][y]>target:
                y=y-1
            else:
                x=x+1
        return False

常规遍历

不管矩阵有啥规律,直接暴力遍历查找是否有target。

//c++
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
       for(const  auto&i:matrix)    for(int j:i)    if(j==target)    return true;
       return false;
    }
};

#python
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for i in matrix:
            for j in i:
                if j==target:
                    return True
        return False

二分查找

查找中的二分查找,利用c++与python中的内置函数。

c++

  • lower_bound 是 C++ 标准库中的一个二分查找算法,用于在有序范围内查找第一个>=target 的元素。

  • row.begin() 和 row.end() 分别表示当前行的起始和结束迭代器。

  • a 是查找结果的迭代器,指向第一个不小于 target 的元素。

python

  • bisect.bisect_left 是 Python 标准库 bisect 模块中的一个函数,用于在有序列表中查找目标值的插入位置。

  •  i 是当前行的有序列表,target 是要查找的目标值。

  • a是 target 在 i 中应该插入的位置索引。如果 target 存在于 i 中,a是第一个等于 target 的元素的索引;如果 target 不存在,a是第一个>= target 的元素的索引。

//c++
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
       for(const  auto&i:matrix)
       {
            auto a=lower_bound(i.begin(),i.end(),target);
            if(a!=i.end() && *a==target)    return true;
       }
       return false;
    }
};

#python
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for i in matrix:
            a=bisect.bisect_left(i,target)
            if a<len(i) and i[a]==target:
                return True
        return False