当前位置: 首页 > news >正文

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

思路分析:

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

思路二:二分查找

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

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;
    }
};

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

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)
    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. (先这样  后面有了全新的理解之后,再回来补充)

相关文章:

  • 力扣-回溯-93 复原IP地址
  • go http Client net/http
  • 在Linux上创建一个Docker容器并在其中执行Python脚本
  • 解决Spring Data JPA set值后自动更新到数据库问题
  • SpringBoot教程(十四) SpringBoot之集成Redis
  • Java数据结构---栈
  • Rust编程语言入门教程(八)所有权 Stack vs Heap
  • 大白话TypeScript第一章基础入门
  • [Android]浏览器下载的apk文件无法识别无法安装问题
  • 抓包工具 wireshark
  • JavaScript 语言基础之标签语句
  • centos7安装python3.11
  • ASP.NET Core 简单文件上传
  • 科技快讯 | DeepSeek推出NSA加速长上下文训练,xAI Grok系列将陆续开源,月之暗面发布Kimi Latest新模型
  • 基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Flowmix/Docx 多模态文档编辑器:新增【操作留痕】功能,让文档编辑有迹可循!...
  • Mac【卸载 Python】 - 3.12.2
  • C++多项式Lasso回归(多变量函数拟合)
  • 使用权威的文件及磁盘擦除工具,避免不安全的文件删除带来的风险
  • 【量化策略】布林带突破策略
  • 帮人家做网站怎么赚钱/网站诊断工具
  • 网站设计的原则有哪些/深圳seo
  • 做旅行路线的网站/2345浏览器主页网址
  • 上海市住房和城乡建设管理局网站/百度官网认证多少钱
  • 做网站用win还是li/网络营销的工作内容包括哪些
  • 白云鄂博矿区网站建设/专业关键词排名软件