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

leetCode-hot100-数组专题之双指针

数组双指针专题

  • 1.同向双指针
    • 1.1例题
      • 26.删除有序数组中的重复项
      • 27.移除元素
      • 80.删除有序数组中的重复项 Ⅱ
  • 2.相向双指针
    • 2.1例题
      • 11.盛最多水的容器
      • 42.接雨水
      • 581.最短无序连续子数组

双指针在算法题中很常见,下面总结双指针在数组中的一些应用,主要分为两类:

1.同向双指针

题目中有原地不适用额外空间等关键词,一般解决方法是定义两个快慢指针:
快指针:用来遍历数组,并进行一些规则匹配
慢指针:用来表示结果数组,即当前符合条件的数组

最后一般是返回慢指针的下标,需要注意的是有时候不能只返回慢指针的下标,可能需要+1,需要根据实际情况分析。

1.1例题

26.删除有序数组中的重复项

思路:
本题设置一个辅助下标指针idx指向数组的第一个元素,然后往后遍历数组,如果遇到了相同的元素就跳过,遇到不同的元素则加入到辅助下标的后一个元素,依次类推,直到遍历数组结束,最后返回idx+1即为所求的长度。详细的视频讲解点击视频讲解-删除有序数组中的重复项。
时间复杂度:
时间复杂度为O(n),只进行了一次数组的遍历。
代码实现:

class Solution {public int removeDuplicates(int[] nums) {if(nums.length < 2) return nums.length;int idx = 0;for(int i = 1;i < nums.length;i++){if(nums[i] != nums[idx]){idx = idx + 1;nums[idx] = nums[i];}}return idx + 1;}
}

27.移除元素

思路:
本题的思路和第26题一样,需要一个辅助下标idx,遍历整个数组,当遇到数组元素不等于val时,则将其加入到删除后的数组中,同时辅助下标后移,遍历结束后返回辅助下标idx的值即可,详细的视频讲解点击视频讲解-移除元素。
时间复杂度:
时间复杂度为O(n)n为数组的长度。
代码实现:

class Solution {public int removeElement(int[] nums, int val) {int idx = 0;for(int i = 0;i < nums.length;i++){if(nums[i] != val){nums[idx] = nums[i];idx = idx + 1;}}return idx;}
}

80.删除有序数组中的重复项 Ⅱ

思路:
本题采用双指针来求解,解法和26.删除有序数组中的重复项类似,但是由于本题中每个元素可以出现两次,所以将idx设置为1,设置前两个位置为结果数组,第二个指针从索引为2开始,比较当前元素和结果数组中的倒数第二个元素的值是否相等(即nums[idx - 1],注意这里不要使用nums[--idx],因为这样会改变idx的值,导致索引不正确),如果相等则i++,继续向后遍历,如果不相等则加入到结果数组中(这里可以这样做的原因是nums有序数组!!!如果是无序数组则不能这么做),下面是一个模拟的例子:
在这里插入图片描述
视频讲解点击视频讲解-删除有序数组中的重复项 Ⅱ
时间复杂度:
时间复杂度为O(n),其中n为数组的长度。
代码实现:

class Solution {public int removeDuplicates(int[] nums) {if(nums.length <= 2) return nums.length;int idx = 1;for(int i = 2;i < nums.length ; i++){if(nums[i] != nums[idx - 1]){nums[++idx] = nums[i];}}return idx + 1;}
}

2.相向双指针

双指针 一般是一个在开头,一个在结尾,两者相向处理问题,一般用来确定某个符合条件的子数组,需要维护左右边界。

2.1例题

11.盛最多水的容器

思路:
本题采用双指针来求解,由于盛水的体积为宽✖高,因此可以定义首尾两个指针,枚举出不同高度的体积并取最大值,在移动指针的过程中,应该移动高度较小的指针,因为盛水的高度是由短板来决的,如图,不同的颜色表示每次移动指针后得到的体积。视频讲解点击视频讲解-盛最多水的容器。
在这里插入图片描述

时间复杂度:
时间复杂度为O(n),空间复杂度O(1)
代码实现:

class Solution {public int maxArea(int[] height) {int ans = 0;int l = 0;int r =height.length - 1;while(l < r){ans = Math.max(ans,Math.min(height[l],height[r]) * (r-l));if(height[l] < height[r]) l++;else r--;}return ans;}
}

42.接雨水

思路:
本题采用双指针来求解,类似于11.盛水最多的容器,盛水的多少取决于左右柱子里较低的一个。通过维护左边和右边的最大高度,来计算整个数组中的装水容量,定义两个变量lmaxrmax,初始值都为0,用于记录当前位置左边和右边的最大高度,不断更新左右两边的最大高度来计算每个位置的水位,然后将各个位置的水位差累加起来得到总的装水容量,下面是一个模拟的例子:
在这里插入图片描述
视频讲解点击视频讲解-接雨水。
时间复杂度:
这段代码的时间复杂度是O(n),其中n是height数组的长度。由于只使用了一个while循环来遍历height,没有嵌套的循环,因此时间复杂度是线性的。
代码实现:

class Solution {public int trap(int[] height) {int l = 0;int r = height.length - 1;int lmax = 0;int rmax = 0;int ans = 0;while(l < r){lmax = Math.max(lmax,height[l]);rmax = Math.max(rmax,height[r]);if(lmax < rmax){ans += lmax - height[l];l++;} else{ans += rmax - height[r];r--;}}return ans;}
}

581.最短无序连续子数组

思路:
本题采用双指针解决,分别从数组的两端进行遍历,确定结果数组的左右边界。确定左边界的条件如果当前元素小于左边界处的最大值,则更新右边界,否则更新左边界的最大值(左边界的右边不应该出现比左边界小的值);确定右边界的条件是如果当前元素大于右边界处的最小值,则更新左边界,否则更新右边界的最小值(右边界的左边不应该出现比右边界大的值),得到左右边界后返回子数组的长度即可。
时间复杂度:
时间复杂度为O(n)n为数组长度。
代码实现:

class Solution {public int findUnsortedSubarray(int[] nums) {//初始化工作://start、end分别是从前向后和从后向前遍历数组的两个指针//需要注意的是end不是从len - 1开始,初始值应该为-1,这是为了处理数组本来就是有序数组的情况//lmax、rmin分别是遍历过程中维护的左边界的最大值和右边界的最小值int len = nums.length;int start = 0;int end = -1;int lmax = nums[0];int rmin = nums[len - 1]; for(int i = 0;i < len ; i++){//确定左边界if(nums[i] < lmax){end = i;} else {lmax = nums[i];}//确定右边界if(nums[len - i - 1] > rmin){start = len - i -1;} else {rmin = nums[len - i -1];}}return end - start + 1;}
}

参考资料:双指针-数组

相关文章:

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…...

完成商品SPU管理页面

文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目&#xff0c;使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包&#xff0c;然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…...

Ansible实战YAML语言完成apache的部署,配置,启动全过程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f3dd;️Ansible专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日15点59分 目录 &#x1f4af;趣站推荐&#x1f4af; &#x1f38a;前言 ✨️YAML语言回顾 &#x1f386;1.编写YAML文…...

深入探索微软Edge:新一代浏览器的演进与创新

在数字时代的浪潮中&#xff0c;浏览器已不再只是简单的网页访问工具&#xff0c;而是成为了连接信息、服务与用户之间的重要桥梁。微软Edge作为微软公司推出的一款全新的浏览器&#xff0c;不仅承载着微软在互联网领域的最新愿景&#xff0c;还融合了多项前沿技术&#xff0c;…...

k8s使用Volcano调度gpu

k8s部署 https://www.yangxingzhen.com/9817.html cri-dockerd安装 https://zhuanlan.zhihu.com/p/632861515 安装nvidia-container-runtime https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 安装k8s-device-plugin https://…...

x的平方根-力扣

本题想到使用二分法不断逼近一个区间&#xff0c;直到最后趋近于x&#xff0c;从而求得解。注意的点&#xff0c;一开始使用 if(mid * mid < x) 进行判断时&#xff0c;会出现越界&#xff0c;原因是输入一个很大的数是&#xff0c;超过int表示的范围&#xff0c;继而修改为…...

hot100 -- 回溯(上)

目录 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;电话号码的字母组合 AC DFS &#x1f33c;组合总和 AC DFS &#x1f35e;科普 忘记 dfs 的&#xff0c;先看看这个&#x1f447; DFS&#xff08;深度优先搜索&#xf…...

5.24数据库作业

考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F: {A→BCD&#xff0c;BC→DE&#xff0c;B→D&#xff0c;D→A} 1、计算B的闭包。 2、(使用Armstrong公理)证明AF是超码。 3、计算上述函数依赖集F的正则覆盖&#xff1b;给出你的推导的步骤并解释。 4、基于正则覆盖&#xff0…...

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置&#xff0c;我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…...

Python异常处理:打造你的代码防弹衣!

Hi&#xff0c;我是阿佑&#xff0c;上文咱们讲到——揭秘Python的魔法&#xff1a;装饰器的超能力大揭秘 ‍♂️✨&#xff0c;阿佑将带领大家通过精准捕获异常、使用with语句和上下文管理器、以及异常链等高级技巧来增强代码的健壮性。就像为代码穿上防弹衣&#xff0c;保护它…...

Linux——进程与线程

进程与线程 前言一、Linux线程概念线程的优点线程的缺点线程异常线程用途 二、Linux进程VS线程进程和线程 三、Linux线程控制创建线程线程ID及进程地址空间布局线程终止线程等待分离线程 四、习题巩固请简述什么是LWP请简述LWP与pthread_create创建的线程之间的关系简述轻量级进…...

ping 探测网段哪些地址被用

#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…...

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…...

asgasgas

asdgasdgsa...

Go语言实现人脸检测(Go的OpenCV绑定库)

文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…...

springboot中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面&#xff0c;例如一个池塘&#xff0c;线程池就是这个池塘&#xff0c;池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程&#xff0c;在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…...

ubuntu20.04 开机自动挂载外加硬盘

文章目录 一、问题描述二、操作1. 查找新添盘符2. 格式化硬盘文件系统3. 挂载硬盘4. 开机自动挂载5. 取消挂载6. 查看挂载的硬盘信息 一、问题描述 因电脑使用一段时间后自身硬盘不足&#xff0c;需外加硬盘使得电脑自动识别加载。 二、操作 1. 查找新添盘符 sudo blkid自己…...

5.18 TCP机械臂模拟

#include <netinet/tcp.h>//包含TCP选项的头文件 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h>//读取输入事件 #include <sys/types.h> #include <sys/stat.h&…...

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…...

低代码开发:拖拽式可视化构建工业物联网系统

什么是低代码&#xff1f; 低代码(Low Code)是一种可视化的软件开发方法&#xff0c;通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面&#xff0c;从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…...

App无辜躺枪?手把手教你搞定腾讯手机管家误报导致的应用商店下架

当合规应用遭遇误报下架&#xff1a;开发者系统性应对指南运动健康类应用被标记为金融诈骗软件&#xff1f;社交工具因"病毒风险"被各大商店紧急下架&#xff1f;这类看似荒谬的误报事件&#xff0c;正在成为中小开发团队的"无妄之灾"。某知名运动App开发团…...

从USB转TTL接线到手机热点配网:ESP8266无线通信保姆级避坑指南(附软件包)

从USB转TTL接线到手机热点配网&#xff1a;ESP8266无线通信保姆级避坑指南 当你第一次拿起ESP8266模块时&#xff0c;可能会被这个小巧的Wi-Fi模块惊艳到——它只有指甲盖大小&#xff0c;却蕴含着强大的无线通信能力。但很快&#xff0c;这种惊艳就会变成困惑&#xff1a;为什…...

Android 11开发避坑:为什么你的App获取的Wifi MAC地址总是变?手把手教你配置固定MAC

Android 11开发实战&#xff1a;彻底解决Wifi MAC地址随机化问题最近在开发一个设备管理系统时&#xff0c;遇到了一个棘手的问题&#xff1a;我们的App在Android 11设备上获取的Wifi MAC地址每次都不一样&#xff0c;导致基于MAC地址的设备识别功能完全失效。经过一周的深入研…...

DIY复刻经典:Texar Audio Prism动态处理器克隆套件全攻略

1. 项目概述&#xff1a;Texar Audio Prism 克隆套件如果你在专业音频圈子里混过一段时间&#xff0c;尤其是对上世纪八九十年代那些经典的、带点“魔法”色彩的外置动态处理器感兴趣&#xff0c;那么“Texar Audio Prism”这个名字你大概率不会陌生。它不是最常见的1176或者LA…...

Taotoken平台快速获取APIKey并开始你的第一个Python调用示例

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken平台快速获取APIKey并开始你的第一个Python调用示例 1. 准备工作&#xff1a;注册与登录 要开始使用Taotoken&#xff0c…...

电子商务设计师软考备战:特别篇 - 综合模拟与备考策略

1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试&#xff1a;上午9:00-11:30&#xff08;150分钟&#xff09;应用技术考试&#xff1a;下午2:00-4:30&#xff08;150分钟&#xff09;题型与分值分布上午考试&#xff08;基础知识&#xff09;&#xff1a; -…...

WebSocket实时通信架构进阶:Room、命名空间与集群部署

WebSocket实时通信架构进阶:Room、命名空间与集群部署 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 WebSocket已经成为实时应用的标准技术,但大多数教程只停留在"建立连接、发送消息"的基础阶段。在生产环境中,你需要处理Room管理、命名空…...

Office RibbonX Editor:简单三步打造你的专属Office界面

Office RibbonX Editor&#xff1a;简单三步打造你的专属Office界面 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...

浏览器指纹识别机制深度剖析与反识别技术实现

一、浏览器指纹技术基础认知1.1 浏览器指纹的核心定义在数字化时代&#xff0c;每一台接入互联网的设备都会留下独特的数字标识&#xff0c;浏览器指纹便是其中最关键的识别凭证之一。浏览器指纹是网站通过 JavaScript 脚本、HTTP 请求头、硬件接口调用等多种技术手段&#xff…...

ComfyUI-WD14-Tagger:3分钟实现AI智能图像标签提取,效率提升10倍

ComfyUI-WD14-Tagger&#xff1a;3分钟实现AI智能图像标签提取&#xff0c;效率提升10倍 【免费下载链接】ComfyUI-WD14-Tagger A ComfyUI extension allowing for the interrogation of booru tags from images. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-WD14-…...