从零学算法240

news/2024/7/5 7:09:30

240.编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入: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
示例 2:
输入: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 = 20
输出:false
两个示例为同一矩阵:
请添加图片描述

  • 仔细观察你会发现,如果以右上角为顶点,逆时针旋转 45o,这就类似于二叉搜索树,左边的数都小于父节点,右边的数都大于右节点,所以我们从顶点 matrix[i,j] 开始搜索,当它小于 target 我们就 i+1 去往右节点,当它大于 target 我们就 j-1 去左顶点
  •   public boolean searchMatrix(int[][] matrix, int target) {
          int row = 0, col = matrix[0].length - 1;
          while(row < matrix.length && col >= 0){
              if(matrix[row][col] > target)col--;
              else if(matrix[row][col] < target)row++;
              else return true;
          }
          return false;
      }
    
  • 说实话,想到有序应该最先想到二分,我们直接遍历每一行进行二分查找,由于矩阵从上到下也是升序,所以在从上到下遍历每一行时,左上角也就是当前遍历行的行首为未查找部分矩阵的最小值,target 小于行首则说明小于剩下的所有值,那直接可以退出循环返回 false 了,而如果 target 大于行尾则直接查下一行即可。
  •   public boolean searchMatrix(int[][] matrix, int target) {
          int n = matrix[0].length - 1;
          for(int i=0;i<matrix.length;i++){
              if(matrix[i][0] > target)break;
              if(matrix[i][n] < target)continue;
              int col = binarySearch(matrix[i], target);
              if (col != -1) return true;
          }
          return false;
      }
      public int binarySearch(int[] nums, int target){
          int left = 0, right =nums.length - 1;
          int mid = -1;
          while(left <= right){
              mid = left + (right - left) / 2;
              if(nums[mid] == target)return mid;
              if(nums[mid] < target) left = mid + 1;
              else right = mid - 1;
          }
          return -1;
      }
    

http://lihuaxi.xjx100.cn/news/2035098.html

相关文章

Linux----防火墙之保存规则

一、关于iptables规则的保存 之前写的iptables的设置&#xff0c;但是都是临时生效的&#xff0c;一旦电脑重启&#xff0c;那么就会失效&#xff0c;如何永久保存&#xff0c;需要借助iptables-save命令&#xff0c;开机生效需要借助iptables-restore命令&#xff0c;并写入规…

如何在 Linux 系统中查看系统日志

Linux 系统提供了强大的日志功能,可以记录系统和应用程序的各种事件和错误信息。系统日志对于故障排除和性能监控非常重要。 图片 一、使用命令行工具查看系统日志 使用 journalctl 命令查看系统日志:journalctl 命令是 systemd 日志管理器的客户端工具,它可以查看 system…

yolov8源码解读Detect层

yolov8源码解读Detect层 Detect层解读网络各层解读及detect层后的处理 关于网络的backbone,head&#xff0c;以及detect层后处理&#xff0c;可以参考文章结尾博主的文章。 Detect层解读 先贴一下全部代码,下面一一解读。 class Detect(nn.Module):"""YOLOv8 …

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用&#xff01;&#xff01; 不会安装的&#xff0c;还没安装的移步这里&#xff0c;ios17 以上目前装不了&#xff0c;别看了&#xff1a;永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后&#xff0c;次序不变&#xff0c;则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

2024024期传足14场胜负前瞻

2024024期赛事由亚冠5场&#xff0c;欧冠4场、英超1场、英冠4场组成。售止时间为2月20日&#xff08;周二&#xff09;17点30分&#xff0c;敬请留意&#xff1a; 本期中深盘中等&#xff0c;1.5以下赔率5场&#xff0c;1.5-2.0赔率5场&#xff0c;其他场次是平半盘、平盘。本期…

【Funny Game】 人生重开模拟器

目录 【Funny Game】 人生重开模拟器&#xff01; 人生重开模拟器&#xff01; 文章所属专区 Funny Game 人生重开模拟器&#xff01; 人生重开模拟器&#xff0c;让你体验从零开始的奇妙人生。在这个充满惊喜和挑战的游戏中&#xff0c;你可以自由选择性别、出生地、家庭背景…

openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优

文章目录 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优223.1 逻辑内存管理参数223.2 执行算子是否下盘的参数 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优 数据库的复杂查询语句性…