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

【练习】双指针算法思想

  • 🎥 个人主页: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从前往后遍历的过程中:

  1. 遇到0元素,cur++
  2. 遇到非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 的出现会复写两次,导致没有复写的数「被覆 盖掉」。

因此我们选择「从后往前」的复写策略。 但是「从后向前」复写的时候,我们需要找到「最后⼀个复写的数」,因此我们的⼤体流程分两 步: 

  1. 先找到最后⼀个复写的数;
  2. 然后从后向前进⾏复写操作

 整体流程:

  1. 初始化两个指针, cur = 0,dest =  -1;
  2. 找到最后一个复写的数;当cur < n时,判断cur位置的元素,是0的话dest,往后移动两步;不为0,移动一位;当dest走到最后一个位置或者等于数组长度,就breadk结束循环,否则,cur++
  3. 判断dest,是否越界.越界让最后一个位置的元素改成0,cur向前移动一位,dest 移动两位
  4. 从cur的位置开始往前遍历数组,cur 为0,把dest 和 dest -1位置的元素都改成0,移动两位;cur 不为0,dest位置的元素改为cur的,dest - -;
  5. 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,重复上诉过程. 

 

解法二: 利用单调性,使用双指针解决.

  1. 取一部分区间进行模拟[6,2,5,4]
  2. 刚开始直接拿4和6,进行计算,V =  h (高)* w (宽) 
  3. 假设,4在向内枚举2和5时,不难发现宽始终在减少,高会有两种情况,遇见小的数,h 减少,w 减少,v一定减少;遇到大的数,h 不变,w减少,v减少
  4. 那较小的数向内枚举,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已经是最大值了,无论加谁都是大于第三个数的.

 

  1. 对数组进行排序
  2. 开始:count 统计个数; 固定一个最大的数(最右边),left指向最左边 ,right 指向最大数减一的位置.
  3. 在最大数区间内,使用双指针算法,快速统计符合要求的个数. (循环上图过程)

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;}

相关文章:

【练习】双指针算法思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Java算法&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 移动零 1.1 题目描述 1.2 讲解算法原理 1.3 编…...

Leetcode 20. 有效的括号

心路历程&#xff1a; 看到括号问题直接想到栈&#xff0c;但是纠结了一下题目中给出的 ‘2. 左括号必须以正确的顺序闭合’ 这一约束&#xff0c;其实这句话的意思简化了题目要求&#xff0c;[(])这样的字符串就不满足要求了。 注意的点&#xff1a; 1、注意最后需要栈为空…...

jupyter | mac jupyter快捷键

【ctrlenter】&#xff1a;是运行选中的单元格&#xff0c;他会停留在此 > 执行 【optionenter】&#xff1a;是运行单元格并且在下面插入一个新的单元格 > 执行 【shiftenter】:是 运行单元格, 并选择下面的单元格 > 执行 【Tab】键用来代码补全 【A】键&#xf…...

么样才能用最便捷的方式为Mac提速呢?

Mac是现代人日常工作时必不可少的工具&#xff0c;尤其是在居家办公已经屡见不鲜的当下。视频会议、文档传送、视频剪辑等等。它在工作中扮演的角色越来越重要&#xff0c;所以也导致了它的流畅程度可以在很大程度上影响人们一整天的工作效率和心情。 但是影响Mac的运行和响应速…...

专业前沿问题问答合集10-2——比特币的加密原理

专业前沿问题问答合集10-2——比特币的加密原理 比特币的加密原理 比特币作为一种加密货币,其安全性和功能性主要基于密码学原理和区块链技术。以下是比特币加密原理的关键组成部分: 1. 非对称加密(公钥和私钥) 比特币使用非对称加密技术来确保交易的安全性。每个比特币…...

C++中的流

前言 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种数据传输的抽象概念&#xff0c;用于在程序中对输入和输出进行操作。流分为输入流和输出流&#xff0c;允许数据在程序和外部设备&#xff08;如键盘、屏幕、文件&#xff09;之间进行传输。输入流用于从外部获…...

解决vue3中使用v-html,click不生效的问题

问题背景 说明&#xff1a; 前端接收到来自后端的一个长字符串&#xff0c;要求把里面的图片替换成为超链接&#xff0c;并且要通过请求一个接口进行图片下载。 举例说明 就是下列这样的一个字符串&#xff1a;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将实时生成游戏画面

&#x1f989; AI新闻 &#x1f680; OpenAI GPT商店面临质量与合规问题 摘要&#xff1a;OpenAI旗下的GPT商店因存在大量涉嫌侵权内容、助长学术不诚实行为及违规内容等问题而引起关注。其中包括未经授权使用迪士尼、漫威角色生成内容的GPT模型&#xff0c;以及声称能绕过剽…...

前端根据pdf连接点击下载pdf而不是直接打开

参考地址: https://www.cnblogs.com/jackson-yqj/p/11321275.html /*** 文件链接转文件流下载--主要针对pdf 解决谷歌浏览器a标签下载pdf直接打开的问题* param url &#xff1a;文件链接* param fileName &#xff1a;文件名;* param type &#xff1a;文件类型;*/functio…...

pytorch中的gather函数的定义和作用是什么?

在PyTorch中&#xff0c;gather函数是一个用于从张量&#xff08;tensor&#xff09;中收集特定索引位置上的元素的函数。它主要用于高级索引和从张量中提取特定信息。 定义&#xff08;python&#xff09; gather函数的基本定义如下&#xff1a; torch.gather(input, dim, i…...

[ABC206E] Divide Both 解题记录

[ABC206E] Divide Both 解题记录 题意简述 给定整数 L , R L,R L,R&#xff0c;求满足以下条件的数对 ( 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 题目分析 正难则反&#xff0c;考虑用所有的满足第一条性质的…...

常见的服务器技术和服务器技术的重要性

服务器技术是指一系列用于构建、维护和管理服务器的技术和工具&#xff0c;旨在确保服务器能够高效、稳定、安全地运行&#xff0c;以满足客户端的请求并提供各种服务。它涵盖了服务器硬件、操作系统、网络协议、数据存储和安全等多个方面的知识和技能。今天&#xff0c;德迅云…...

MATLAB中的数学建模:基础知识、实例与方法论

前言 在当今科技高速发展的时代&#xff0c;数学建模成为了解析复杂世界的关键工具&#xff0c;而MATLAB作为一种专业的科学计算软件&#xff0c;为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称&#xff0c;更是一个集数值分析、矩阵计算、算法开发和…...

Flutter与Xamarin跨平台APP开发框架的区别

嘿&#xff0c;各位亲爱的朋友们&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我们要探讨的话题是&#xff1a;Flutter与Xamarin这两款热门的跨平台APP开发框架。我深知选择合适的开发工具对于开发者来说有多么重要。那么&#xff0c;当我们需要开发跨平台应用时…...

【JAVA】Springboot集成Proguard完成jar包混淆

目录 一、需求背景 二、具体实现 一、需求背景 某些情况下需要将jar包交付给第三方&#xff0c;担心第三方会将代码进行反编译&#xff0c;故需要将jar包进行处理。 jar包源码混淆工具有多种&#xff0c;但真正能投入使用的产品并不多。 比如 ClassFinal (ClassFinal: Jav…...

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…...

4.windows ubuntu 子系统:微生物宏基因组测序和分析流程概括。

微生物宏基因组测序和分析流程大致可以分为以下几个步骤&#xff1a; DNA提取&#xff1a;需要从微生物样本中提取DNA。2.建库构建&#xff1a;提取到的DNA需要进行建库构建&#xff0c;包括DNA片段的断裂、末端修复、连接连接适配器等操作。3.高通量测序&#xff1a;建库构建完…...

S2-066分析与复现

Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间&#xff0c;期间断断续续地写&#xff0c;直到最近才完成&#xff0c;o(╥﹏╥)o。羞愧地回顾一下官方通告&#xff1a; 2023.12.9发布&#xff0c;编号CVE-2023-50164&#xff0c;主要影响版本是 2.5.0-2.5.32 以及 6.0.…...

让天下没有难学的大模型!我整理一份大模型技术知识图谱!

最近陆续有一些同学反馈&#xff0c;感觉大模型知识点太多了&#xff0c;找不到头绪。 今天我整理一份大模型技术以及应用的知识图谱&#xff0c;让大家轻松学习大模型&#xff0c;喜欢点赞、收藏、关注。 另外&#xff0c;技术交流可以文末加入我们。 大模型的预训练技术 …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...