算法专题——双指针

目录

前言

1、移动0

2、复写零

3、快乐数

4、盛最多水的容器

5、有效三⻆形的个数

6、和为s的两个数字 

7、三数之和 

8、四数之和


前言

本文主要介绍一些用到双指针的常见算法题。


1、移动0

链接:https://leetcode.cn/problems/move-zeroes/description/

本题为数组分隔、数组分块问题,常见解法是使用双指针。

定义两个指针分别为cur和dest,将该数组划分为三个部分。使用cur遍历数组,cur前代表处理完的数据,cur后代表待处理的数据。dest前代表非0数字,dest后为0数字。

n为数组长度,数据会被划分为三个区间,[0,dest]为处理后非零,[dest+1,cur-1]为处理后0,[cur,n-1]为待处理。

执行逻辑:cur在从前向后遍历的过程中,如果遇到0将该元素留在第二个区间 cur++,如果遇到非0证明要把该元素换到第一个区间则dest++,置换nums[cur]和nums[dest]后cur++。

class Solution {public void moveZeroes(int[] nums) {int cur=0,dest=-1;while(cur<nums.length){if(nums[cur]==0){cur++;}else{dest++;int temp=nums[dest];nums[dest]=nums[cur];nums[cur]=temp;cur++;}}}
}

扩展:该思想同样适用于快排,快排时会找到一个标志数temp,要求temp左边的元素小于ntemp,右边的元素大于temp。和左边非0右边0其实是一样的,只需要替换if中的条件即可。

2、复写零

链接:https://leetcode.cn/problems/duplicate-zeros/submissions/588110496/

本题虽然显示是简单,但是非常难,先根据异地移动思考,转化为就地操作。从前往后遍历会出问题,所以从后往前遍历,先要确定好cur的位置,画图做,很难想。

class Solution {public void duplicateZeros(int[] arr) {int cur=0,dest=0;int n=arr.length;//找到开始反向操作的节点while(cur<=n){//到末尾处会出现两种情况if(dest==n){cur--;dest--;break;}if(dest==n+1){arr[dest-2]=0;dest-=3;cur-=2;break;}if(arr[cur]!=0){dest++;}else{dest+=2;}cur++;}//开始反向遍历while(cur>=0){       if(arr[cur]!=0){arr[dest]=arr[cur];cur--;dest--;}else{arr[dest--]=0;arr[dest--]=0;cur--;}}}
}

3、快乐数

链接:https://leetcode.cn/problems/happy-number/

本题有两种情况,一种是变成1,另一种是无限循环,也就是说某次计算后变成了之前出现过的数字。1再经过计算后还是1,所以这也可以看做是一种循环。所以本题最后的结果可以看作两种循环,一种循环里没有1,一种循环里全是1,我们只要判断循环里是否有1就行了。那么第一步就是进入到循环,在hot100中有一道环形链表的题,通过那到题的思路我们可以想到,想要进入到循环要使用快慢指针。

class Solution {//定义一个计算一个数各位平方和的函数public int bit_square(int n) {int sum=0;while(n!=0){int m=n%10;sum+=m*m;n=n/10;}return sum;}public boolean isHappy(int n) {int slow=n;int fast=bit_square(n);while(slow!=fast){slow=bit_square(slow);fast=bit_square(bit_square(fast));}if(slow==1){return true;}else{return false;}}
}

4、盛最多水的容器

链接:https://leetcode.cn/problems/container-with-most-water/description/

这道题首先想到的是用暴力求解法,也就是遍历一遍,把所有的值计算一边找出最大的,但这样做会超时。然后我们可以尝试找一下规律,发现计算两个位置的体积后,那个高度较小的位置与这两个位置之间的任何位置的体积都比原来小。所以我们直接选择两个端点,在计算后高度较小的那个数直接排除掉,向左和向右平移即可。 

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

5、有效三⻆形的个数

链接:https://leetcode.cn/problems/valid-triangle-number/submissions/588461959/

解法一:暴力求解

用暴力求解可以遍历所有的可能,然后把满足要求的加到一起,时间复杂度为N^3.

解法二:双指针

三角形的判定条件为两边之和大于第三边,我们没必要判别三次,只要保证最小的两条边大于第三边即可,这样只需要判别一次,所以在最开始先给数据排序。

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int count=0;//从数组最右侧开始遍历,每次把数组的最右侧设为标志位,判断剩下的数里有多少种两个数的组合和它能构成三角形for(int i=nums.length-1;i>=2;i--){int left=0,right=i-1;while(left<right){//如果此时满足是大于,那么left和right中间的的数和right处的数构成的组合也一定满足要求if(nums[left]+nums[right]>nums[i]){count+=right-left;right--;}else{//如果此时是小于,那么left和right中间的的数和left处的数构成的组合一定不满足要求left++;}}}return count;}
}

 使用双指针时间复杂度为N^2。

6、和为s的两个数字 

链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/description/ 

本题题目已经说了升序,用双指针可以很轻松的做出来。

class Solution {public int[] twoSum(int[] price, int target) {int left=0,right=price.length-1;while(left<right){if(price[left]+price[right]==target){return new int[]{price[left],price[right]};}else if(price[left]+price[right]>target){right--;}else{left++;}}return new int[2];//照顾编译器,必须有返回值}
}

7、三数之和 

链接:https://leetcode.cn/problems/3sum/

 借助上一道题两数之和的思想,这道题可以类比。我们可以先排序(方便去重,数组里只要保存着相同的元素就算顺序不一样也算重复),然后固定最开始的元素作为数a,然后从后面找两个数的和等于a的相反数,就转化为了两数之和。然后取第二个数为数a,再找后面的相加为a的相反数的两个数,重复这个操作。

这道题注意要去重,找到⼀个结果之后, left 和 right 指针要跳过重复的元素,当使⽤完⼀次双指针算法之后,固定的 a 也要跳过重复的元素。

8、四数之和

链接:https://leetcode.cn/problems/4sum/

结合三数之和和两数之和的思想,可以很轻松的做出来,这道题有个坑是他弄了一个很大的数,所以需要用long来存。

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res=new ArrayList<>();Arrays.sort(nums);int n=nums.length;for(int i=0;i<=n-4;){long target1=target-nums[i];for(int j=i+1;j<=n-3;){int left=j+1,right=n-1;long target2=target1-nums[j];while(left<right){long sum=nums[left]+nums[right];if(sum<target2){left++;}else if(sum>target2){right--;}else{res.add(new ArrayList(Arrays.asList(nums[left],nums[right],nums[i],nums[j])));left++;right--;while(nums[left-1]==nums[left]&&left<right){left++;}while(nums[right+1]==nums[right]&&left<right){right--;}}}j++;while(nums[j-1]==nums[j]&&j<=n-3){j++;}}i++;while(nums[i-1]==nums[i]&&i<=n-4){i++;}}return res;}
}


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

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

相关文章

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

【Chrome Extension】一、CSDN计时扩展设计

【Chrome Extension】一、CSDN计时扩展设计 重点内容内容脚本 content_scripts 文件目录1、整体目录2、manifest.json3、scripts/content.js4、css/content.css 重点内容 内容脚本 content_scripts 1、manifest.json文件配置 {"manifest_version": 3, # *依赖Chro…

javaEE-线程的常用方法-4

目录 一.start():启动一个线程 调用start()方法 start()方法只能调用一次&#xff1a; java中的API: start()和run()的区别: 二.中断一个线程 中断线程方法1:引入标志位 中断线程方法2:调⽤interrupt()⽅法 抛出的异常: 三.等待一个线程 join() 四、获取线程引用 五…

AI的进阶之路:从机器学习到深度学习的演变(四)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;三&#xff09; 五、深度学习的应用领域 深度学习的应用领域广泛&#xff0c;涵盖了计算机视觉、自然语言处理、语音识别和推荐系统等多个方面。以下将详细探讨这些关键应用领域&#xff0c;展示深度学习在不同…

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版) 文章目录 Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配置时间同步6.配置内核转发及网桥过滤二.容器运行时Containerd安装(所有节点)…

圣诞快乐(h5 css js(圣诞树))

一&#xff0c;整体设计思路 圣诞树h5&#xff08;简易&#xff09; 1.页面布局与样式&#xff1a; 页面使用了全屏的黑色背景&#xff0c;中央显示圣诞树&#xff0c;树形由三层绿色的三角形组成&#xff0c;每一层的大小逐渐变小。树干是一个棕色的矩形&#xff0c;位于三角…

PostgreSQL和Postgis安装

Windows下PostgreSQL和对应的版本的Postgis安装 PostgreSQL安装 1、官网下载地址 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2、根据自己的系统下载完成&#xff0c;Windows下可以直接傻瓜式安装就OK 建议不要通过自带的这个程序安装postgis,…

拒绝 Helm? 如何在 K8s 上部署 KRaft 模式 Kafka 集群?

首发&#xff1a;运维有术 今天分享的主题是&#xff1a;不使用 Helm、Operator&#xff0c;如何在 K8s 集群上手工部署一个开启 SASL 认证的 KRaft 模式的 Kafka 集群&#xff1f; 本文&#xff0c;我将为您提供一份全面的实战指南&#xff0c;逐步引导您完成以下关键任务&a…

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

&#x1f3af;导读&#xff1a;本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则&#xff0c;利用负载均衡将请求转发至不同的后端服务&#xff0c;并集成了Token验证过滤器以确保API的安全访问&#xff0c;同时支持白名单路…

浅析InnoDB引擎架构(已完结)

大家好&#xff0c;我是此林。 今天来介绍下InnoDB底层架构。 1. 磁盘架构 我们所有的数据库文件都保存在 /var/lib/mysql目录下。 由于我这边是docker部署的mysql&#xff0c;用如下命令查看mysql数据挂载。 docker inspect mysql-master 如下图&#xff0c;目前只有一个数…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

苹果手机怎么清理空间:拯救你的拥挤手机

在数字生活的海洋中&#xff0c;我们的苹果手机就像一艘小船&#xff0c;载满了照片、应用、视频和各种下载的“宝贝”。随着时间的推移&#xff0c;这艘小船开始变得拥挤&#xff0c;航行速度放缓&#xff0c;甚至有时候直接卡壳。苹果手机怎么清理空间&#xff1f;是时候学会…

三、使用langchain搭建RAG:金融问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…

C语言 函数嵌套

#include <stdio.h> void new_line() {printf("hehe\n"); } void three_line() {int i 0;for (i 0; i < 3; i){new_line;} } int main() {three_line();return 0; } 函数可以嵌套调用&#xff0c;但不能嵌套定义 链式访问 main有三个参数 //main函数的…

问题解决:发现Excel中的部分内容有问题。是否让我们尽量尝试恢复? 如果您信任此工作簿的源,请单击“是”。

在开发同步导出功能是遇到了如标题所示的问题&#xff0c;解决后遂记录下来供大家参考。 RestController public class XxxController {PostMapping("/export")public BaseResponse export(RequestBody PolicyErrorAnalysisExportReq exportReq, HttpServletRespons…

基于ST STM32MP257FAK3的MP2控制器之工业PLC 方案

简介 1.可编程逻辑控制器&#xff08;PLC&#xff09;是种专门为在工业环境下应用而设计的数字运算操作电子系统。它采用一种可编程的存储器&#xff0c;在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令&#xff0c;通过数字式或模拟式的输入输出来控制…

golang自定义MarshalJSON、UnmarshalJSON 原理和技巧

问题出现的原因&#xff1a;在前后端分离的项目中&#xff0c;经常出现的问题是时间戳格式的问题。 后端的日期格式兼容性强&#xff0c;比较完善。前端由于各种原因&#xff0c;日期格式不完善。 就会产生矛盾。 ms int64比较通用&#xff0c;但是unix时间没有可读性&#xff…

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…

使用 AI 辅助开发一个开源 IP 信息查询工具:一

本文将分享如何借助当下流行的 AI 工具,一步步完成一个开源项目的开发。 写在前面 在写代码时&#xff0c;总是会遇到一些有趣的机缘巧合。前几天&#xff0c;我在翻看自己之前的开源项目时&#xff0c;又看到了 DDNS 相关的讨论。虽然在 2021 年我写过两篇相对详细的教程&am…

Powershell学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…