【练习】双指针算法思想

  • 🎥 个人主页: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;}

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

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

相关文章

【Kafka系列】Kafka事务一般在什么场景下使用呢

面试官&#xff1a;听说你精通Kafka&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以【面试官面试】的形式来分享技术&#xff0c;本期是《Kafka系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;生产者重…

ideaSSM 学员信息管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 学员信息管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

现代游戏引擎架构

一、并行编程 1.1 为什么需要并行编程 游戏的渲染计算对算力要求很高&#xff0c;所以我们需要把操作系统的资源利用到极致。 但是摩尔定律已经不在适用了&#xff0c;硬件的发展目前已经达到瓶颈。所以我们需要通过数量来提高计算效率。 1.2 并行编程基础 进程与线程&#…

eclipse中使用PlantUML plugin查看对象关系

一.背景 公司安排的带徒弟任务&#xff0c;给徒弟讲了如何设计对象。他们的思维里面都是单表增删改查&#xff0c;我的脑海都是一个个对象&#xff0c;他们相互关系、各有特色本事。稳定的结构既能满足外部功能需求&#xff0c;又能在需求变更时以最小代价响应。最大程度的记录…

NIVision-相机图像采集

应用场景 上位机与工业相机通讯&#xff0c;控制相机抓取图像。 工业相机的通讯接口大多为USB口或网口。 USB口则直接将通讯线缆插入上位机USB端口&#xff0c;打开MAX中设备与接口一栏可以看到电脑给相机分配的资源名称&#xff1b;网口则需要将网线连接相机和上位机&#xf…

课时72:流程控制_for循环_嵌套循环

1.1.1 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

基于python+vue学生作业管理系统flask-django-nodejs-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

docker 不同架构镜像融合问题解决

1、背景 docker 作为目前容器的标准之一&#xff0c;但是对于多种架构的平台的混合编译支撑不是很好。因此衍生了镜像融合&#xff0c;分别将多种不同的架构构建好&#xff0c;然后将镜像进行融合上传。拉取镜像的会根据当前系统的架构拉取不同的镜像&#xff0c;也可以通过 -…

【mysql 127错误】mysql启动报错mysqld.service: Failed with result ‘exit-code‘.

无网环境&#xff0c;mysql 安装 出现如下错误 [rootmysql tools]# systemctl status mysqld.service ● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since…

Jupyter R绘图 汉字显示乱码的解决办法

1.Jupyte中&#xff0c;R绘图&#xff0c;汉字显示乱码 2.如何解决&#xff1f; (1)R中安装showtext 登录linux服务器 #R > install.packages(“showtext”) … 出错 (2)退出R,安装freetype-config #apt install libfreetype6-dev 出错 &#xff08;3&#xff09;进入R&…

vi\vim编辑器详解

vi\vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而…

Springboot+vue的四川美食分享网站+数据库+报告+免费远程调试

项目介绍: Springbootvue的四川美食分享网站。Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的四川美食分享网站&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

无插件网页视频播放器,支持图像绘制(包含方格子、方框等),支持音视频播放、支持录像截图,提供源码下载

前言 本播放器内部采用jessibuca插件接口&#xff0c;支持录像、截图、音视频播放等功能。播放器播放基于ws流&#xff0c;图像绘制操作&#xff1a;1&#xff09;支持绘制方格子&#xff0c;用于监控移动检测画框&#xff1b;2&#xff09;支持绘制不透明方框&#xff0c;用于…

AI智能分析网关V4在非煤矿山安全生产视频智能监管场景中的应用

近年来&#xff0c;全国非煤矿山&#xff08;&#xff08;含金属非金属矿山、尾矿库&#xff0c;以及矿泉水等其他矿山&#xff09;安全生产工作取得明显成效&#xff0c;但安全基础仍然薄弱&#xff0c;事故总量仍然较大&#xff0c;重特大事故尚未得到根本遏制&#xff0c;安…

Maven发布开源框架到远程仓库

1.背景 当你写了一个自我感觉良好的开源工具希望给他人分享&#xff0c;如果只是在github等网站进行公布之外&#xff0c;用户使用起来还不是很方便&#xff0c;特别是当你提供是特定领域的基础工具。你还可以把它部署到中央仓库&#xff0c;这样别人使用就会方便很多。接下来…

【nginx】反向代理和负载均衡

文章目录 一、介绍二、好处三、反向代理和负载均衡3.1 nginx 反向代理的配置方式3.2 nginx 负载均衡的配置方式&#xff1a; 一、介绍 nginx 反向代理&#xff1a; 就是将前端发送的动态请求由 nginx 转发到后端服务器 二、好处 nginx 反向代理的好处&#xff1a; 提高访问速…

【CKA模拟题】如何发布一个SVC资源

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesYou have an existing Nginx pod named nginx-pod . Perform the following steps: Expose the nginx-pod internally within the cl…

python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

函数解包 """ 1、函数的注释&#xff1a;参数和返回值 在注释里可以自动添加显示&#xff0c;只需手动加说明。2、函数的解包【拆包】&#xff1a;函数的参数要传递数据有多个值的时候&#xff0c;中间步骤拿到数据 保存在元组或者列表 或者字典里。 - 传递参数…

等高线图怎么生成3d模型---模大狮模型网

要将等高线图转换为3D模型&#xff0c;可以按照以下步骤进行操作&#xff1a; 准备等高线图&#xff1a; 首先&#xff0c;确保你有一张清晰的等高线图。等高线图显示了地形或物体在不同高度上的等高线&#xff0c;可以是数字化的图像文件或手绘的地图。 导入等高线图&#x…

2024华为OD统一考试(C卷)最新题库(Java Python C++)

关于华为OD ​ 华为的员工补充途径有三种&#xff0c;分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径&#xff0c;但是从近几届开始竞争非常激烈&#xff0c;尤其是在CV、AI、NLP等赛道上&#xff0c;所以对于C9等专业的学生来说&#xff0c;可以考虑转向一些冷…