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

个人主页:手握风云

专栏:算法

目录

一、双指针算法思想

二、算法题精讲

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;生产环境连接真实数据库 当存在某个类时才启用特定功能 根据配置文件开关…

【CPP】迭代器失效问题 static和inline

文章目录 迭代器失效**常见的迭代器失效场景**1. **std::vector**2. **std::deque**3. **std::list**4. **std::map / std::set**5. **std::unordered_map / std::unordered_set** **总结&#xff1a;迭代器失效场景****如何避免迭代器失效&#xff1f;** static 和 inline1. s…

visual studio安装

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

conda配置channel

你收到 CondaKeyError: channels: value https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main not present in config 错误是因为该镜像源&#xff08;https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main&#xff09;可能没有被正确添加到 Conda 的配置文件中&…

Windows编译FreeRDP步骤

1. **安装必要工具** powershell # 安装 Visual Studio 2022 (勾选"C桌面开发"组件) # 安装 CMake: https://cmake.org/download/ # 安装 Git: https://git-scm.com/ 2. **安装依赖项** powershell # 使用vcpkg包管理 git clone https://github.com/Microsoft/vcpk…

Fortunately 和 luckily区别

Fortunately 和 luckily 的确是同义词&#xff0c;都表示“幸运地”&#xff0c;用于描述某件事发生得很幸运&#xff0c;带有积极、正面的含义。然而&#xff0c;尽管它们的意思相近&#xff0c;fortunately 和 luckily 在使用上有一些细微的差别。 1. 含义相似 Fortunately…

【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;助力…

pthread_cond_broadcast的概念和使用案例

pthread_cond_broadcast 是 POSIX 线程&#xff08;Pthreads&#xff09;库中用于条件变量&#xff08;Condition Variable&#xff09;操作的函数&#xff0c;定义在 <pthread.h> 头文件中。它的核心作用是唤醒所有等待在某个条件变量上的线程&#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函数②父子进程关…

C语言教学第三课:运算符与表达式

一、课程导入 同学们&#xff0c;上节课我们学习了变量和数据类型&#xff0c;这些是C语言的基础。今天&#xff0c;我们将继续深入学习C语言中的运算符与表达式。运算符是C语言中用于执行各种操作的符号&#xff0c;而表达式则是由变量、常量和运算符组成的有意义的组合。通过…

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模型调用 三、本地化部署接口调…