优选算法的灵动之章:双指针专题(一)

个人主页:手握风云

专栏:算法

目录

一、双指针算法思想

二、算法题精讲

2.1. 查找总价格为目标值的两个商品

2.2. 盛最多水的容器

​编辑

2.3. 移动零

2.4. 有效的三角形个数


一、双指针算法思想

        双指针算法主要用于处理数组、链表等线性数据结构中的问题。它通过设置两个指针,在数据结构上进行遍历和操作,从而实现高效解决问题。

二、算法题精讲

2.1. 查找总价格为目标值的两个商品

       我们优先想到的是暴力解法:利用两层for循环来检验两个数的和是否为目标值。那么此时的时间复杂度为O(n^{2})

class Solution {public int[] twoSum(int[] price, int target) {int len = price.length;for(int i=0;i<len;i++){for(int j=i+1;j<len;j++){if(price[i]+price[j] == target){return new int[]{price[i],price[j]};}}}return new int[0];}
}

       但题目当中给出数组是按照升序排列的,那么我们就可以利用单调性定义左右两个指针来遍历数组。我们先定义一个sum变量,sum的值等于左右指针所指的值之和。然后通过sum与target的比较,如果sum小于target,则左指针向右移动;如果sum大于target,则右指针向左移动;如果sum等于target,则返回两个数。

完整代码实现:

class Solution {public int[] twoSum(int[] price, int target) {int len = price.length;int left = 0,right = len-1;while(left < right){int sum = price[left] + price[right];if(sum < target){left++;} else if (sum > target) {right--;}else{return new int[]{price[left],price[right]};}}return new int[0];}
}

2.2. 盛最多水的容器

       首先,我们得明白如何计算容器的体积,容器的底就可以用两个数组的下标相减得到,容器的高根据木桶效应是数组中最小的元素。我们先选左右边界来作为容器,此时我们记容器体积为v1,如果left指针向右移动,则容器的底一定在减小,如果遇到比左边界小的数,那么高就会减小,如果遇到比左边界大的数,那么高不变。所以容器的体积一定是在减小。此时我们就可以把左边界干掉,left向右移动,得到新的容器体积v2,根据上面的逻辑,我们同理可以把右边界干掉。以此类推,直到找出最大的容器体积。

class Solution {public int maxArea(int[] height) {int len = height.length;int left = 0,right = len-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;}
}

2.3. 移动零

        本题要求在不复制数组的情况下原地对数组进行操作。我们先定义cur和dest两个指针,cur指针的作用是先扫描数组,将数组分为已处理和待处理的两个区间,dest指针是将已处理的区间变为非零区间和零区间。当cur遇到零元素时,不做任何处理,直接让cur向右移动一位;当cur遇到非零元素时,先让dest向右移动一位,再让两个指针所指向的值进行交换。直到cur遍历完整个数组

  

完整代码实现:

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

2.4. 有效的三角形个数

        要找到有效的三角形个数,就是在数组中找到能够构成三角形的三元子数组。我们首先想到的暴力解法,利用三层for循环来查找,此时的时间复杂度为O(n^{3})

        对于三条边的比较,我们只需要让三角形较小的两条边之和与最大的边进行比较即可。,要想得到最大值,首先我们可以先对数组进行一个排序,使数组呈升序排列。排序之后,先固定右侧的最大值,在定义left和right两个指针,让right指针指向被固定值的左侧。如果两个元素之和大于最大值,那么left指针向右移动,两个元素之和一定会大于最大值,此时我们就可以干掉右指针所指向的数;如果两个元素之和小于等于最大值,那么right指针向左移动,两个元素之和一定会小于等于最大值,此时我们就可以干掉左指针所指向的数。完成之后,我们就可以将固定值向左移动,在进行上述操作,直到固定数组的第三个元素。

完整代码实现:

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);//排序,优化int ret = 0,len = nums.length;for (int i = len-1; i >= 2; i--) {//先固定最大的数int left = 0,right = i-1;while(left < right){if(nums[left] + nums[right] > nums[i]){ret += right - left;right--;}else{left++;}}}return ret;}
}

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

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

相关文章

ROS应用之SwarmSim在ROS 中的协同路径规划

SwarmSim 在 ROS 中的协同路径规划 前言 在多机器人系统&#xff08;Multi-Robot Systems, MRS&#xff09;中&#xff0c;SwarmSim 是一个常用的模拟工具&#xff0c;可以对多机器人进行仿真以实现复杂任务的协同。除了任务分配逻辑以外&#xff0c;SwarmSim 在协同路径规划方…

MVC、MVP和MVVM模式

MVC模式中&#xff0c;视图和模型之间直接交互&#xff0c;而MVP模式下&#xff0c;视图与模型通过Presenter进行通信&#xff0c;MVVM则采用双向绑定&#xff0c;减少手动同步视图和模型的工作。每种模式都有其优缺点&#xff0c;适合不同规模和类型的项目。 ### MVVM 与 MVP…

【BUUCTF杂项题】后门查杀、webshell后门

前言&#xff1a;Webshell 本质上是一段可在 Web 服务器上执行的脚本代码&#xff0c;通常以文件形式存在于 Web 服务器的网站目录中。黑客通过利用 Web 应用程序的漏洞&#xff0c;如 SQL 注入、文件上传漏洞、命令执行漏洞等&#xff0c;将 Webshell 脚本上传到服务器&#x…

Spring中@Conditional注解详解:条件装配的终极指南

一、为什么要用条件装配&#xff1f; 在实际开发中&#xff0c;我们经常需要根据不同的运行环境、配置参数或依赖情况动态决定是否注册某个Bean。例如&#xff1a; 开发环境使用内存数据库&#xff0c;生产环境连接真实数据库 当存在某个类时才启用特定功能 根据配置文件开关…

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本&#xff0c;例如“Visual Studio Community”&#xff08;免费版本&#xff09;&#x…

【C语言深入探索】:指针高级应用与极致技巧(二)

目录 一、指针与数组 1.1. 数组指针 1.2. 指向多维数组的指针 1.2.1. 指向多维数组元素的指针 1.2.2. 指向多维数组行的指针 1.3. 动态分配多维数组 1.4. 小结 二、指针与字符串 2.1. 字符串表示 2.2. 字符串处理函数 2.3. 代码示例 2.4. 注意事项 三、指针与文件…

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序源码在抖音招商加盟中的应用与创新

摘要&#xff1a;本文深入探讨了在短视频蓬勃发展的时代背景下&#xff0c;招商加盟领域借助抖音平台所具备的独特优势。同时&#xff0c;全面剖析开源AI智能名片2 1链动模式S2B2C商城小程序源码这一创新工具&#xff0c;详细阐述其如何与抖音招商加盟深度融合&#xff0c;助力…

爬虫学习笔记之Robots协议相关整理

定义 Robots协议也称作爬虫协议、机器人协议&#xff0c;全名为网络爬虫排除标准&#xff0c;用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件&#xff0c;一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…

Unity游戏(Assault空对地打击)开发(4) 碰撞体和刚体的添加

前言 飞机和世界的大小关系不太对&#xff0c;我稍微缩小了一下飞机。 详细步骤 选中所有地形对象&#xff0c;如果没有圈起的部分&#xff0c;点击Add Component搜索添加。 接着选中Player对象&#xff0c;添加这两个组件&#xff0c;最好&#xff08;仅对于本项目开发&#x…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

Maven全解析:从基础到精通的实战指南

概念&#xff1a; Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建&#xff0c;依赖管理和项目信息管理项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 依赖管理&#xff1a; 对第三方依赖包的管理&#xf…

MATLAB实现单层竞争神经网络数据分类

一.单层竞争神经网络介绍 单层竞争神经网络&#xff08;Single-Layer Competitive Neural Network&#xff09;是一种基于竞争学习的神经网络模型&#xff0c;主要用于数据分类和模式识别。其核心思想是通过神经元之间的竞争机制&#xff0c;使得网络能够自动学习输入数据的特…

Weevely代码分析

亲测php5和php8都无效&#xff0c;只有php7有效 ailx10 1949 次咨询 4.9 网络安全优秀回答者 互联网行业 安全攻防员 去咨询 上一次做weevely实验可以追溯到2020年&#xff0c;当时还是weevely3.7&#xff0c;现在的是weevely4 生成php网页木马依然差不多…… php菜刀we…

【AI大模型】DeepSeek API大模型接口实现

目录 一、DeepSeek发展历程 2023 年&#xff1a;创立与核心技术突破 2024 年&#xff1a;开源生态与行业落地 2025 年&#xff1a;多模态与全球化布局 性能对齐 OpenAI-o1 正式版​ 二、API接口调用 1.DeepSeek-V3模型调用 2.DeepSeek-R1模型调用 三、本地化部署接口调…

具身智能-强化学习-强化学习基础-马尔可夫

文章目录 参考强化学习基础强化学习特点reward函数两种强化学习两种策略&#xff1a;探索&#xff08;Exploration&#xff09; vs. 利用&#xff08;Exploitation&#xff09;gym库的使用 马尔可夫马尔可夫过程马尔可夫奖励过程&#xff08;Markov Reward Process, MRP&#x…

半导体器件与物理篇5 mosfet及相关器件

认识mos二极管 MOS二极管是研究半导体表面特性最有用的器件之一。MOS二极管可作为存储电容器&#xff0c;并且是电荷耦合器件(CCD)的基本结构单元。 MOS二极管结构的重要参数包括&#xff1a;氧化层厚度d&#xff1b;施加于金属平板上的电压V&#xff08;正偏压时V为正&#x…

037 DFS回溯

1.回溯模板求排列 2.回溯模板求子集 # 当前位于点x&#xff0c;步长为length def dfs(x,length):passvis[x]length #接下来走下一个点 #判断下一个点是否走过if vis[a[x]]!0:#此时存在环global ansansmax(ans,length-vis[a[x]]1)else:dfs(a[x],length1)nint(input()) a[0]list(…

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…

力扣988. 从叶结点开始的最小字符串

Problem: 988. 从叶结点开始的最小字符串 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 在先序遍历的过程中&#xff0c;用一个变量path拼接记录下其组成的字符串&#xff0c;当遇到根节点时再将其反转并比较大小&#xff08;字典顺序大小&…

本地Ollama部署DeepSeek R1模型接入Word

目录 1.本地部署DeepSeek-R1模型 2.接入Word 3.效果演示 4.问题反馈 上一篇文章办公新利器&#xff1a;DeepSeekWord&#xff0c;让你的工作更高效-CSDN博客https://blog.csdn.net/qq_63708623/article/details/145418457?spm1001.2014.3001.5501https://blog.csdn.net/qq…