秋招突击——7/10——复习{}——新作{在排序数组中查找元素的第一个最后一个位置、搜索旋转排序数组}

文章目录

    • 引言
    • 复习
    • 新作
      • 在排序数组中查找元素的第一个和最后一个位置
        • 个人实现
        • 参考实现
      • 搜索旋转排序数组
        • 个人实现
        • 参考实现
    • 总结

引言

复习

新作

在排序数组中查找元素的第一个和最后一个位置

题目链接

在这里插入图片描述
注意

  • 非递减序列==》元素是递增或者相等,并不是严格递增的
  • 找到给定目标值在数组中开始的位置和结束的位置
  • 时间复杂度是logn
个人实现
  • 这道题就是典型的二分查找的,但是需要知道你背的模板的特点的——“左加大,右减小”
class Solution {public int[] searchRange(int[] nums, int tar) {//define result vectorint[] res = {-1,-1};if(nums.length == 0)    return res;// binary findint m = nums.length;int l = 0,r = m - 1;while(l < r){int mid = (l + r) >> 1;if(nums[mid] >= tar) r = mid;else l = mid + 1;}// System.out.println(l);// judge whether find the valueif(nums[l] != tar)   return res;// the value is the first bigger numwhile(l >= 1 && nums[l - 1] == tar)  l --;while(r + 1 < m && nums[r + 1] == tar)  r++;res[0] = l;res[1] = r;return res;}
}
  • 写是写完了,这里得去看一下Java中数组的操作,这里整的有点不熟悉,导致很多操作和C++弄混了!
// create the fixed length array
int[] fixedArray = new int[5];
int[] ifxedArray = {1,2,3,4,5};
参考实现
  • 这里是使用了两个不同的模板,一个确定左边界,还有一个是确定有边界的。具体两个模板如下

确定左边界

int l = 0,r = m-1;
while(l < r){int mid = (r + l) >> 1;if(nums[mid] >= tar)	r = mid;else l = mid + 1;
}
// l is the left edge 

确定右边界

int l = 0,r = m - 1;
while(l < r){int mid = (l + r + 1) >> 1;  // 仅仅针对右边界,防止死循环if(nums[mid] <= tar)	l = mid;else r = mid - 1;
}

最终实现如下

class Solution {public int[] searchRange(int[] nums, int tar) {//define result vectorint[] res = {-1,-1};if(nums.length == 0)    return res;// binary findint m = nums.length;int l = 0,r = m - 1;while(l < r){int mid = (l + r) >> 1;if(nums[mid] >= tar) r = mid;else l = mid + 1;}// judge whether find the valueif(nums[l] != tar)   return res;res[0] = l;// the value is the first bigger numl = l ;r = m - 1;while(l < r){int mid = (l + r + 1) >> 1;System.out.println(mid);if(nums[mid] <= tar)    l = mid;else r = mid - 1;}res[1] = r;return res;}
}

搜索旋转排序数组

  • 题目链接
    在这里插入图片描述
    注意
  • 数组严格单调递增
  • 数组不为空
  • 数组的值不会存在溢出的情况
个人实现
  • 这道题是一个二分查找,但是需要转换坐标,将当前坐标转换为未旋转之前的坐标,或者是对其进行分段二分,然后查找目标值。
  • 现在有一个问题,无论是哪种方法,都需要知道在哪里进行的反转,如果完整遍历一次对应元素,时间复杂度就是O(n),肯定超时,现在就是想着通过单调递增的方式,尽量快速确定反转的地方。
  • 找到反转点
    • 元素与元素 之间只有严格的大于或者小于关系,往后遍历就是一定大于,往前遍历一定小于,异常就是说明旋转点,就在这一段
  • 找到target就是使用二分查找
class Solution {public int binFind(int[] nums,int l,int r,int tar){while(l < r){int mid = (l + r) >> 1;if(nums[mid] >= tar) r = mid;else  l = mid + 1;}return l;}public int search(int[] nums, int tar) {int m = nums.length ;// handle the edge situationif(m == 1)  return nums[0] == tar?0:-1;// find the reverse pointint len = m / 2;int revP = 0;while(len > 1){if(nums[revP] < nums[revP + len - 1]){revP += len;}else{len /= 2;}}// find the target int res;System.out.println(revP);if(tar > nums[0]){res = binFind(nums,0,revP,tar);}else{System.out.println("last");res = binFind(nums,revP + 1 ,m - 1,tar);}System.out.println(res);// judge the result if(nums[res] == tar)    return res;else return -1;}
}

在这里插入图片描述
这里只能通过部分样例

  • 因为第一个是总是能够算准的,但是第二个不好处理,不应该呀!第二个总是越界,出现各种各样的问题!
    • 反转点在第一个元素的位置
    • 反转点在最后一个元素的位置
    • 仅有两个元素,如何进行判定

但是就是会出现异常!难受!

参考实现
  • 这里整体的思路和我的一样,先找划分点,然后二分查找。

这里有一个很巧妙的地方,就是一开始根据条件确定旋转点,类似的二分都可以用同样的思路

  • 基本想法和我的是一样的,都是通过等分对应区间长度,然后在进行比较划分,只不过他的套用模板,可靠性更高!

在这里插入图片描述

  • 具体实现代码如下
class Solution {public int search(int[] nums, int tar) {int m = nums.length ;// handle the edge situationif(m == 1)  return nums[0] == tar?0:-1;// find the reverse pointint l = 0 ,r = m - 1;while(l < r){int mid = (l + r + 1) >> 1;if(nums[mid] >= nums[0]) l = mid;else  r = mid - 1;}// find the target if(tar >= nums[0] ){l= 0;}else{l = l + 1;r = m - 1; }while(l < r){int mid = (l + r) >> 1;if(nums[mid] >= tar) r = mid;else  l = mid + 1;}// judge the result if(nums[r] == tar)    return r;else return -1;}
}

对于模板的进一步总结
左加大返回右,右减小返回左

// 方案一,右边界
int l = 0,r = m - 1;
while(l < r){int mid = (r+l)>>1;if(nums[mid] >= tar)	r = mid;else l = mid + 1;
}
return r;// 方案二,左边界
int l = 0,r = m - 1;
while(l < r){int mid = (r+l)>>1;if(nums[mid] <= tar)	l = mid;else r = mid - 1;
}
return l;

总结

  • 昨天是纯纯摆烂了,主要是最近的状态属实不是很好,学不进去,昨晚上看了一会电视,聊了会天,看了会书,然后十二点就睡了,早上起来挺早的,背了会书,现在开始刷算法,进度还行,调整一下,效果还是很好的!
  • 投了字节的另外一个部门,然后居然还给我面试了,这周五,继续加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么软件可以AI生成PPT?交给这5款AI PPT工具就完事

话说在当下快节奏的工作中&#xff0c;PPT制作几乎已经成为不可或缺的一部分~每天不是在做PPT的路上&#xff0c;就是在改PPT的途中。 好在幸运的是&#xff0c;现在可有不少好用的AI PPT制作工具能够来帮助我们轻松应对这一难题&#xff01;今天就来给大家分享5款实在又百搭的…

Autosar网络管理:发出第一帧网络管理报文的方法

Autosar网络管理:发出第一帧网络管理报文的方法 1. 为什么要第一帧发出网络管理报文 很多OEM要求CAN网络管理第一帧发出的是网络管理报文,目的是为了快速唤醒CAN网络 2. 节点外发第一帧报文不是网络管理报文的原因 首先根据AUTOSAR CANNM规范要求,节点要能够发出网络管理…

TCP协议双向网络通讯---Python实现

本篇文章是博主在人工智能、网络通讯等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在Python…

捷配笔记-PCB阻焊颜色对产品有什么影响?

阻焊层也称为阻焊层或阻焊剂。它是一种薄的聚合物层&#xff0c;应用于&#xff08;PCB&#xff09;。阻焊层的目的是保护PCB表面&#xff0c;并有助于防止焊桥。焊桥是两个导体之间的无意连接&#xff0c;通常是由于存在一小块焊料。需要注意的是&#xff0c;阻焊层被视为其单…

electron实现右键菜单保存图片功能

1.创建窗口&#xff0c;加载页面&#xff0c;代码如下&#xff1a; //打开窗口const {ipcMain, BrowserWindow} require("electron") const saveImage require("../ipcMain/saveImage") let win null; ipcMain.handle(on-open-event, (event, args) &g…

数字信号处理及MATLAB仿真(5)——z变换

采样的其他概念咱们后面再慢慢的讲述吧&#xff0c;先把z变换的程序给大家展示一下&#xff0c;总的来说呢&#xff0c;就用一个函数——ztran就行了。在 MATLAB 中&#xff0c;可以使用 ztrans 函数来进行 Z 变换。ztrans 函数用于对离散时间信号或系统进行 Z 变换&#xff0c…

mysql中select语句的执行顺序

执行顺序是什么&#xff1f; Form 这一阶段读取表的数据&#xff0c;并准备执行后续的操作。如果有多表连接&#xff0c;这一步也会涉及连接操作&#xff08;INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 等&#xff09;。 ON 在进行表连接时&#xff0c;使用 ON 关键字指…

C++入门 模仿mysql控制台输出表格

一、 说明 控制台输出表格&#xff0c;自适应宽度 二、 源码 #include <iostream> #include <map> #include <string> #include <vector>using namespace std;void printTable(vector<vector<string>> *pTableData) {int row pTableDa…

VS2022 git拉取/推送代码错误

第一步&#xff1a;打开VS2022 第二步&#xff1a;工具->选项->源代码管理->Git 全局设置 第三步&#xff1a;加密网络提供程序设置为&#xff1a;OpenSSL 完结&#xff1a;

基于java+springboot+vue实现的大学城水电管理系统(文末源码+Lw)106

基于SpringBootVue的实现的大学城水电管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 本大学城水电管理系统 管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备管理&#x…

AV1编码标准中块分区技术详细说明

libaom 开放媒体联盟视频1&#xff08;AV1&#xff09;编解码器的框架基于一种混合视频编码结构&#xff0c;由几个主要的功能模块组成&#xff0c;如预测、变换、量化、熵编码和环路滤波。每个功能模块使用特定类型的视频编码技术处理输入数据&#xff0c;其输出被送入另一个功…

科研绘图系列:R语言金字塔图(pyramid plot)

介绍 金字塔图(Pyramid chart)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。这种图表通常用于展示人口结构,比如性别和年龄的分布。 特点: 年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。性别区分:通常,男性和女性的数据会被分别展…

FiddlerScript Rules修改-更改发包中的cookie

直接在fiddler script editor中增加如下处理代码即可 推荐文档oSession -- 参数说明 测试笔记 看云

fork的理解

一. 注意点 1.进程是并发的&#xff0c;主进程和子进程同时进行&#xff0c;效率高2.子进程产生时是完全复制主进程的状态的&#xff0c;只有在产生修改的时候才会单独分配资源。 二. 下面程序一共应该为8个进程&#xff0c;但code的终端看到只有7个进程号的原因。因为fork返…

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…

【Linux】管道命令

命令执行的时候有时会输出数据&#xff0c;有的命令输出的数据太繁杂了。 那么我们怎么去筛选这些信息来得到我们所想要的格式&#xff1f; 这就牵涉到管道命令的问题了&#xff08;pipe&#xff09;&#xff0c;管道命令使用的是【|】这个界定符号。另外&#xff0c;管道命令与…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg&#xff0c;因为它涉及一些许可证问题。但是&#xff0c;你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

项目管理工具评测:2024年国内外最顶级的10款项目管理工具排行

国内外涌现出众多优秀的项目管理工具&#xff0c;它们各自在功能、易用性、集成能力等方面展现出独特优势。以下是国内外顶级的10款项目管理工具&#xff1a; 一、进度猫 推荐理由&#xff1a;进度猫以其直观的任务管理和进度跟踪功能&#xff0c;成为许多团队和项目的首选…

MybatisPlus 使用教程

MyBatisPlus使用教程 文章目录 MyBatisPlus使用教程1、使用方式1.1 引入依赖1.2 构建mapper接口 2、常用注解2.1 TableName2.2 TableId2.3 TableField MyBatisPlus顾名思义便是对MyBatis的加强版&#xff0c;但两者本身并不冲突(只做增强不做改变)&#xff1a; 引入它并不会对原…

FastAPI 学习之路(三十九)对开发接口进行测试

概况 对于开发好的接口需要进行测试之后才能发布。当我们在开发的时候&#xff0c;没有提前测试&#xff0c;我们也要对我们自己的接口进行测试&#xff0c;那么FastApi自身也带有针对开发的接口进行测试的功能。我们看下FastApi官方给我们提供了什么样的支持。 接口还是基于…