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

LeetCode220902_93、搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
 

示例 1:


图1、 搜索二维矩阵II示例图


输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解一、有序,二分查找

①带剪枝

class Solution{
    public boolean searchMatrix(int[][] matrix, int target){
        for(int i = 0; i < matrix.length; i++){
            if(matrix[i][0] > target) break;
            else if(matrix[i][matrix[0].length - 1] < target) continue;
            int res = binarySearch(matrix[i], target);
            if(res != -1) return true;
        }
        return false;
    }

    public int binarySearch(int[] nums, int target){
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + right >> 1;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return -1;
    }
}

② 有mid赋值left,注意mid是否需要+1

class Solution{
    public boolean searchMatrix(int[][] matrix, int target){
        for(int i = 0; i < matrix.length; i++){
            int left = 0;
            int right = matrix[0].length - 1;
            while(left < right){
                int mid = left + right + 1 >> 1;
                if(matrix[i][mid] <= target) left = mid;
                else right = mid - 1;
            }
            if(matrix[i][right] == target) return true;
        }
        return false;
    }
}

题解二、从右上角开始遍历,每次可去掉一行或一列(当前元素左边均比它小,下边均比它大)

class Solution{
    public boolean searchMatrix(int[][] matrix, int target){
        int row = 0;
        int col = matrix[0].length - 1;
        while(row < matrix.length && col >= 0){
            if(matrix[row][col] == target) return true;
            else if(matrix[row][col] < target){
                row++;
            }else{
                col--;
            }
        }
        return false;
    }
}

相关文章:

  • SpringBoot关闭Tomcat容器,SpringBoot使用Jetty容器
  • 记录angular使用codemirror的过程和遇到的问题
  • 猿创征文|当我在追光 我与光同航--我与Java的技术成长之路
  • python基础专栏12-python基础篇-复合数据类型-字典
  • 投入不到一万,月赚十万+的海外平台搬运项目
  • 赚钱副业项目:steam搬砖的一点经验
  • Go 1.18 版本新特性详解!
  • 共码未来 | 多维提升开发技能,玩转各大开发者平台活动
  • html5新增特性之画布canvas的使用
  • 查题校园题库系统 授权即可使用
  • 弹性力学的简单学习
  • 青云霍秉杰:一文读懂Prometheus长期存储主流方案
  • 【Swoole系列4.6】协程连接池
  • 美的集团上半年营收1827亿:净利160亿 狠心批量裁员
  • 手机+卫星,到底有多难?
  • 【347天】每日项目总结系列085(2018.01.18)
  • express如何解决request entity too large问题
  • Gradle 5.0 正式版发布
  • PHP面试之三:MySQL数据库
  • React的组件模式
  • SpriteKit 技巧之添加背景图片
  • 阿里云前端周刊 - 第 26 期
  • 动态魔术使用DBMS_SQL
  • 前端js -- this指向总结。
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 写给高年级小学生看的《Bash 指南》
  • Java性能优化之JVM GC(垃圾回收机制)
  • #AngularJS#$sce.trustAsResourceUrl
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (14)Hive调优——合并小文件
  • (2)(2.10) LTM telemetry
  • (pojstep1.3.1)1017(构造法模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)Flask之app.route装饰器函数的参数
  • (二)斐波那契Fabonacci函数
  • (一)基于IDEA的JAVA基础10
  • ./configure,make,make install的作用(转)
  • .gitignore文件—git忽略文件
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework杂记
  • .NET 指南:抽象化实现的基类
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET开源快速、强大、免费的电子表格组件
  • .NET中GET与SET的用法
  • .net专家(高海东的专栏)
  • ??在JSP中,java和JavaScript如何交互?
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [1] 平面(Plane)图形的生成算法
  • [100天算法】-实现 strStr()(day 52)
  • [Android] Amazon 的 android 音视频开发文档
  • [BZOJ] 2006: [NOI2010]超级钢琴