74. 搜索二维矩阵(LeetCode 热题 100)

题目来源;

74. 搜索二维矩阵 - 力扣(LeetCode)

题目内容:

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

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

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

给你一个整数 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

思路分析:

思路一:暴力解法 遍历矩阵(二维数组)

思路二:二分查找

代码实现(思路一:暴力解法):(替大家试过了提交之后会通过)

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n=matrix.size();//行数
        int m=matrix[0].size();//列数
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]==target)
                return true;
            }
        }
        return false;
    }
};

代码实现(思路二:二分查找):

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        //二分法  开区间写法
        int m=matrix.size();
        int n=matrix[0].size();
        int left=-1;int right= m*n;
        while(left+1<right){
            int mid=left+(right-left)/2;
            int x=matrix[mid/n][mid%n];
            if(x==target)  return true;
            else if(x<target) left=mid;
            else right=mid;
        }
        return false;
    }
};

题目心得:

  1. 自己写的算法 超时

  2. 思考 用闭区间的二分法 怎么实现

  3. 这个二分法 光顾着背模板了 没有去理解代码 这道题写不出来了 也看不懂题解

  4. 这道题目用开区间去做,在积累一下开区间的代码模板 来源:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

    cpp 复制代码
    class Solution {
    
        // lower_bound 返回最小的满足 nums[i] >= target 的下标 i
    
        // 如果数组为空,或者所有数都 < target,则返回 nums.size()
    
        // 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]
    
        int lower_bound(vector<int>& nums, int target) {
    
            int left = -1, right = nums.size(); // 开区间 (left, right)
    
            while (left + 1 < right) { // 区间不为空
    
                // 循环不变量:
    
                // nums[left] < target
    
                // nums[right] >= target
    
                int mid = left + (right - left) / 2;
    
                if (nums[mid] >= target) {
    
                    right = mid; // 范围缩小到 (left, mid)
    
                } else {
    
                    left = mid; // 范围缩小到 (mid, right)
    
                }
    
            }
    
            // 循环结束后 left+1 = right
    
            // 此时 nums[left] < target 而 nums[right] >= target
    
            // 所以 right 就是第一个 >= target 的元素下标
    
            return right;
    
        }
  5. 二分查找原理很容易弄懂,但是在写的时候有边界值问题要处理,我今日遇到的问题就是,答案给出的开区间的写法,我只会闭区间的模板,但我又无法用闭区间去解决这道题。

  6. 对于二分查找还要知道自己要返回什么

  7. (先这样 后面有了全新的理解之后,再回来补充)

相关推荐
DuHz10 分钟前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女30 分钟前
TRSV优化2
算法
代码游侠1 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472461 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
阿猿收手吧!2 小时前
【C++】std::promise原理与实战解析
c++
abluckyboy2 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异2 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653232 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan3 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++
寻寻觅觅☆3 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++