【练习】双指针算法思想

- 🎥 个人主页:Dikz12
- 🔥个人专栏:Java算法
- 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香
- 欢迎大家👍点赞✍评论⭐收藏
目录
1. 移动零
1.1 题目描述
1.2 讲解算法原理
1.3 编写代码
2. 复写零
2.1 题目描述
2.2 讲解算法原理
2.3代码实现
3. 盛最多水的容器
3.1 题目描述
3.2 讲解算法原理
3.3 代码实现
4.有效三角形的个数
4.1 题目描述
4.2 讲解算法原理
4.3代码实现
1. 移动零
1.1 题目描述

1.2 讲解算法原理

这种题型可以划分到:数组划分、数组分块. 解决这类题就有最经典的算法:双指针算法.

定义两个指针,作用:
- cur:从左到右扫描数组,遍历数组.
- dest:在已处理区间内,非0元素的最后一个位置.
如图数组被划分成了三个区间:[0,dest]:非0 ,[dest+1,cur-1]:0,[cur,n-1]:待处理.
做到代码按照上面思路走即可.
cur从前往后遍历的过程中:
- 遇到0元素,cur++
- 遇到非0元素,交换dest+1和cur的值

1.3 编写代码
public void moveZeroes(int[] nums) {int dest = -1;for(int cur = 0;cur < nums.length; cur++) {if(nums[cur] != 0) {dest++;int tmp = nums[cur];nums[cur] = nums[dest];nums[dest] = tmp; }}}
2. 复写零
2.1 题目描述

2.2 讲解算法原理
思路:
如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数「被覆 盖掉」。
因此我们选择「从后往前」的复写策略。 但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两 步:
- 先找到最后⼀个复写的数;
- 然后从后向前进⾏复写操作
整体流程:
- 初始化两个指针, cur = 0,dest = -1;
- 找到最后一个复写的数;当cur < n时,判断cur位置的元素,是0的话dest,往后移动两步;不为0,移动一位;当dest走到最后一个位置或者等于数组长度,就breadk结束循环,否则,cur++
- 判断dest,是否越界.越界让最后一个位置的元素改成0,cur向前移动一位,dest 移动两位
- 从cur的位置开始往前遍历数组,cur 为0,把dest 和 dest -1位置的元素都改成0,移动两位;cur 不为0,dest位置的元素改为cur的,dest - -;
- cur--
2.3代码实现
public void duplicateZeros(int[] arr) {int cur = 0, dest = -1, n = arr.length;//1.找到复写之后数组的最后一个数while(cur < n) {if(arr[cur] == 0) {dest += 2;}else{dest += 1;}if(dest >= n-1) {break;}cur++;}//处理dest越界问题if(dest == n) {arr[n-1] = 0;dest -= 2;cur --;}//2.从后往前完成复写操作while(cur >= 0){if(arr[cur] != 0){arr[dest--] = arr[cur--];}else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
3. 盛最多水的容器
3.1 题目描述


数组放的是高度:第0条线的高度是1,第1条线的高度是8........(对应的数组下标)。
如图:容器的height是由较低的的那条线决定的,而宽度这好等于右边下标减去左边下标.
3.2 讲解算法原理
解方法一: 暴力枚举.O(n^2)
先固定最左边的线1,依次枚举右边的线,所有容器都算一遍,记录最大值;在固定8,重复上诉过程.

解法二: 利用单调性,使用双指针解决.
- 取一部分区间进行模拟[6,2,5,4]
- 刚开始直接拿4和6,进行计算,V = h (高)* w (宽)
- 假设,4在向内枚举2和5时,不难发现宽始终在减少,高会有两种情况,遇见小的数,h 减少,w 减少,v一定减少;遇到大的数,h 不变,w减少,v减少
- 那较小的数向内枚举,v 始终是减少的.所以,可以直接把4干掉.

整体过程:
- 定义两个指针,left 指向最左边,right 指向最右边,初始容积为ret = 0;
- 高度取min(left,right),并记录目前的容积v,在max(v,ret)记录最大容积
- 左边高度小于右边,left--; 否则,right++ (相同,移动哪边都一样).


3.3 代码实现
public int maxArea(int[] height) {int left = 0,right = height.length - 1,ret = 0;while(left < right) {int v = Math.min(height[left],height[right]) * (right - left);ret = Math.max(ret,v);if(height[left] < height[right]) {left++;}else {right--;}}return ret;}
4.有效三角形的个数
4.1 题目描述

4.2 讲解算法原理
解法一:暴力解法.O(n^3)
三层for循环,一层固定一个数 .
伪代码:
for(i = 0; i < n; i++)for(j = i + 1; j < n; j++)for(int k = j + 1; k < n; k++)check(i,j,k)
解法二: 利用单调性,使用双指针来解决问题.

如图,假设选取的三个数是有序的,就会发现第二种情况和第三种情况下,C已经是最大值了,无论加谁都是大于第三个数的.

- 对数组进行排序
- 开始:count 统计个数; 固定一个最大的数(最右边),left指向最左边 ,right 指向最大数减一的位置.
- 在最大数区间内,使用双指针算法,快速统计符合要求的个数. (循环上图过程)
4.3代码实现
public int triangleNumber(int[] nums) {//排序Arrays.sort(nums);int count = 0,n = nums.length;//利⽤双指针快速统计出符合要求的个数for(int i = n - 1; i >= 2; i--) {int left = 0,right = i - 1;while(left < right) {if(nums[left] + nums[right] > nums[i]) {count += right - left;right--;}else{left++;}}}return count;}
相关文章:
【练习】双指针算法思想
🎥 个人主页:Dikz12🔥个人专栏:Java算法📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 1. 移动零 1.1 题目描述 1.2 讲解算法原理 1.3 编…...
Leetcode 20. 有效的括号
心路历程: 看到括号问题直接想到栈,但是纠结了一下题目中给出的 ‘2. 左括号必须以正确的顺序闭合’ 这一约束,其实这句话的意思简化了题目要求,[(])这样的字符串就不满足要求了。 注意的点: 1、注意最后需要栈为空…...
jupyter | mac jupyter快捷键
【ctrlenter】:是运行选中的单元格,他会停留在此 > 执行 【optionenter】:是运行单元格并且在下面插入一个新的单元格 > 执行 【shiftenter】:是 运行单元格, 并选择下面的单元格 > 执行 【Tab】键用来代码补全 【A】键…...
么样才能用最便捷的方式为Mac提速呢?
Mac是现代人日常工作时必不可少的工具,尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要,所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。 但是影响Mac的运行和响应速…...
专业前沿问题问答合集10-2——比特币的加密原理
专业前沿问题问答合集10-2——比特币的加密原理 比特币的加密原理 比特币作为一种加密货币,其安全性和功能性主要基于密码学原理和区块链技术。以下是比特币加密原理的关键组成部分: 1. 非对称加密(公钥和私钥) 比特币使用非对称加密技术来确保交易的安全性。每个比特币…...
C++中的流
前言 在 C 中,流(stream)是一种数据传输的抽象概念,用于在程序中对输入和输出进行操作。流分为输入流和输出流,允许数据在程序和外部设备(如键盘、屏幕、文件)之间进行传输。输入流用于从外部获…...
解决vue3中使用v-html,click不生效的问题
问题背景 说明: 前端接收到来自后端的一个长字符串,要求把里面的图片替换成为超链接,并且要通过请求一个接口进行图片下载。 举例说明 就是下列这样的一个字符串:vaddssss[图片](image_p0_f0.png)dsatewafdsaa[图片](image_p1…...
macOS下Java应用的打包和安装程序制作
文章目录 macOS应用程序结构Java应用打包JavaAppLauncherjpackage其它相关JDK命令附录JavaAppLauncher源码链接macOS应用程序结构 macOS通常以dmg或pkg作为软件发行包,安装到/Applications下后,结构比较统一。 info.plist里的CFBundleExecutable字段可以指定入口,如果不指定…...
OpenAI GPT商店面临质量与合规问题;黄仁勋预测:十年内AI将实时生成游戏画面
🦉 AI新闻 🚀 OpenAI GPT商店面临质量与合规问题 摘要:OpenAI旗下的GPT商店因存在大量涉嫌侵权内容、助长学术不诚实行为及违规内容等问题而引起关注。其中包括未经授权使用迪士尼、漫威角色生成内容的GPT模型,以及声称能绕过剽…...
前端根据pdf连接点击下载pdf而不是直接打开
参考地址: https://www.cnblogs.com/jackson-yqj/p/11321275.html /*** 文件链接转文件流下载--主要针对pdf 解决谷歌浏览器a标签下载pdf直接打开的问题* param url :文件链接* param fileName :文件名;* param type :文件类型;*/functio…...
pytorch中的gather函数的定义和作用是什么?
在PyTorch中,gather函数是一个用于从张量(tensor)中收集特定索引位置上的元素的函数。它主要用于高级索引和从张量中提取特定信息。 定义(python) gather函数的基本定义如下: torch.gather(input, dim, i…...
[ABC206E] Divide Both 解题记录
[ABC206E] Divide Both 解题记录 题意简述 给定整数 L , R L,R L,R,求满足以下条件的数对 ( x , y ) (x,y) (x,y) 的数量。 x , y x,y x,y 不互质 x ∤ y x \nmid y x∤y 且 y ∤ x y \nmid x y∤x 题目分析 正难则反,考虑用所有的满足第一条性质的…...
常见的服务器技术和服务器技术的重要性
服务器技术是指一系列用于构建、维护和管理服务器的技术和工具,旨在确保服务器能够高效、稳定、安全地运行,以满足客户端的请求并提供各种服务。它涵盖了服务器硬件、操作系统、网络协议、数据存储和安全等多个方面的知识和技能。今天,德迅云…...
MATLAB中的数学建模:基础知识、实例与方法论
前言 在当今科技高速发展的时代,数学建模成为了解析复杂世界的关键工具,而MATLAB作为一种专业的科学计算软件,为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称,更是一个集数值分析、矩阵计算、算法开发和…...
Flutter与Xamarin跨平台APP开发框架的区别
嘿,各位亲爱的朋友们!大家好,我是咕噜铁蛋!今天我们要探讨的话题是:Flutter与Xamarin这两款热门的跨平台APP开发框架。我深知选择合适的开发工具对于开发者来说有多么重要。那么,当我们需要开发跨平台应用时…...
【JAVA】Springboot集成Proguard完成jar包混淆
目录 一、需求背景 二、具体实现 一、需求背景 某些情况下需要将jar包交付给第三方,担心第三方会将代码进行反编译,故需要将jar包进行处理。 jar包源码混淆工具有多种,但真正能投入使用的产品并不多。 比如 ClassFinal (ClassFinal: Jav…...
全流程ArcGIS Pro技术应用
GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…...
4.windows ubuntu 子系统:微生物宏基因组测序和分析流程概括。
微生物宏基因组测序和分析流程大致可以分为以下几个步骤: DNA提取:需要从微生物样本中提取DNA。2.建库构建:提取到的DNA需要进行建库构建,包括DNA片段的断裂、末端修复、连接连接适配器等操作。3.高通量测序:建库构建完…...
S2-066分析与复现
Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间,期间断断续续地写,直到最近才完成,o(╥﹏╥)o。羞愧地回顾一下官方通告: 2023.12.9发布,编号CVE-2023-50164,主要影响版本是 2.5.0-2.5.32 以及 6.0.…...
让天下没有难学的大模型!我整理一份大模型技术知识图谱!
最近陆续有一些同学反馈,感觉大模型知识点太多了,找不到头绪。 今天我整理一份大模型技术以及应用的知识图谱,让大家轻松学习大模型,喜欢点赞、收藏、关注。 另外,技术交流可以文末加入我们。 大模型的预训练技术 …...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

