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

个人主页:手握风云
专栏:算法


目录
一、双指针算法思想
二、算法题精讲
2.1. 查找总价格为目标值的两个商品
2.2. 盛最多水的容器
编辑
2.3. 移动零
2.4. 有效的三角形个数
一、双指针算法思想
双指针算法主要用于处理数组、链表等线性数据结构中的问题。它通过设置两个指针,在数据结构上进行遍历和操作,从而实现高效解决问题。
二、算法题精讲
2.1. 查找总价格为目标值的两个商品
我们优先想到的是暴力解法:利用两层for循环来检验两个数的和是否为目标值。那么此时的时间复杂度为。
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循环来查找,此时的时间复杂度为。
对于三条边的比较,我们只需要让三角形较小的两条边之和与最大的边进行比较即可。,要想得到最大值,首先我们可以先对数组进行一个排序,使数组呈升序排列。排序之后,先固定右侧的最大值,在定义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;}
}相关文章:
优选算法的灵动之章:双指针专题(一)
个人主页:手握风云 专栏:算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…...
PyQt4学习笔记1】使用QWidget创建窗口
目录 一、创建一个简单的 QWidget 窗口 二、设置窗口属性 1. 设置窗口标题 2. 设置背景颜色 3. 设置窗口大小和位置 4. 设置窗口模式 5. 关闭窗口 6. QWidget 及其子控件的样式 三、添加控件到 QWidget 1. 添加按钮 2. 添加标签 3. 添加文本框 4. 控件布局管理 四、自定义样式 …...
pycharm 中的 Mark Directory As 的作用是什么?
文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网:https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…...
【C++】string类(上):string类的常用接口介绍
文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…...
CSS关系选择器详解
CSS关系选择器详解 学习前提什么是关系选择器?后代选择器(Descendant Combinator)语法示例注意事项 子代选择器(Child Combinator)语法示例注意事项 邻接兄弟选择器(Adjacent Sibling Combinator࿰…...
C语言中的信号量
信号是操作系统中用来传递特定消息的机制。操作系统可以使用这种方式将程序运行过程中发生的各类特殊情况发送给程序,并按照其指定的逻辑进行处理。信号名称都以 “SIG” 作为前缀,如程序访问非法内存时,会产生名为 SIGSEGV 的信号。 程序需…...
求一个数的数根(高精度)
上一期我们讲的是求一个数的数根,和本期唯一不同的是,数据范围不同了,上一期这个数是小于等于10的18次方的,这一期是小于等于10的1000次方的,开一个变量?肯定不行,我们需要再开一个数组…...
从理论到实践:Linux 进程替换与 exec 系列函数
个人主页:chian-ocean 文章专栏-Linux 前言: 在Linux中,进程替换(Process Substitution)是一个非常强大的特性,它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…...
3 卷积神经网络CNN
1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron,可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…...
详解Linux系统的终端(Terminal)以及分类(各种tty开头的设备文件)
目录 终端(Terminal)的概念和作用终端(Terminal)在Linux中被视为设备,每个终端有自己的设备文件tty三个字母的来源(tty名字的来源)如何查看当前终端的设备文件常见终端的分类1-串口终端02-虚拟控制台终端(Virtual Console)03-伪终端(Pseudo T…...
强化学习数学原理(五)——随机近似与随机
一、Motivating example 首先有个random variable(随机变量)X,我们的目标就是求出他的expectation E(x),我们有一些iid的采样,xi,从1到n,求出均值 但是如果有很多数据,我需要等很久,把所有数据都…...
图书管理系统 Axios 源码__获取图书列表
目录 核心功能 源码介绍 1. 获取图书列表 技术要点 适用人群 本项目是一个基于 HTML Bootstrap JavaScript Axios 开发的图书管理系统,可用于 添加、编辑、删除和管理图书信息,适合前端开发者学习 前端交互设计、Axios 数据请求 以及 Bootstrap 样…...
线性数据结构:单向链表
放弃眼高手低,你真正投入学习,会因为找到一个新方法产生成就感,学习不仅是片面的记单词、学高数......只要是提升自己的过程,探索到了未知,就是学习。 考虑到可能有小白在合并代码时出现各种细节问题,本文…...
线程互斥同步
前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…...
《苍穹外卖》项目学习记录-Day11订单统计
根据起始时间和结束时间,先把begin放入集合中用while循环当begin不等于end的时候,让begin加一天,这样就把这个区间内的时间放到List集合。 查询每天的订单总数也就是查询的时间段是大于当天的开始时间(0点0分0秒)小于…...
SAP HCM 回溯分析
最近总有人问回溯问题,今天把12年总结的笔记在这共享下: 12年开这个图的时候总是不明白是什么原理,教程看N次,网上资料找一大堆,就是不明白原理,后来为搞明白逻辑,按照教材的数据一样做…...
JavaScript原型链与继承:优化与扩展的深度探索
在 JavaScript 的世界里,万物皆对象,而每个对象都有一个与之关联的原型对象,这就构成了原型链的基础。原型链,简单来说,是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]࿰…...
五子棋对弈
问题描述 "在五子棋的对弈中,友谊的小船说翻就翻?" 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第一,比赛第二"的宗旨,决…...
vue vscode插件推荐安装
在 VSCode 中开发 Vue,推荐安装以下插件: 核心插件 1. Volar(Vue Language Features) - Vue 3 官方推荐的开发工具,替代 Vetur。 This extension is deprecated. Use the Vue - Official extension instead. 1.Vue …...
Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法
Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…...
P7497 四方喝彩 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作,分四种: add ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):对于所有 i ∈ [ l , r ] i \in [l,r…...
EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析
EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析 0 预览一 该文件功能`mailbox.c` 文件功能函数预览二 函数功能介绍`mailbox.c` 中主要函数的作用1. `ec_slave_mbox_prepare_send`2. `ec_slave_mbox_prepare_check`3. `ec_slave_mbox_check`4. `ec_slave_mbox_prepare_fetc…...
UI线程用到COM只能选单线程模型
无论用不用UI库,哪怕是用Win32 API手搓UI,UI线程要用COM的话,必须初始化为单线程单元(STA),即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);,不能用MULTITHREADTHREADED。 实际上,很多(WPF等)UI库若…...
排序算法--桶排序
核心思想为分区间排序后合并。适用于数据均匀分布在一个范围内,或浮点数排序或范围明确的数据。如果需要处理整数或其他数据范围,可以通过调整BUCKET_RANGE的计算方式实现,例如对[0,100)的整数排序: int index arr[i] / 10; // …...
zsh安装插件
0 zsh不仅在外观上比较美观,而且其具有强大的插件,如果不使用那就亏大了。 官方插件库 https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins 官方插件库并不一定有所有的插件,比如zsh-autosuggestions插件就不再列表里,下面演示zs…...
bypass hcaptcha、hcaptcha逆向
可以过steam,已支持并发,欢迎询问! 有事危,ProfessorLuoMing...
python-UnitTest框架笔记
UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…...
掌握API和控制点(从Java到JNI接口)_35 JNI开发与NDK 03
3、 如何载入 .so档案 VM的角色 由于Android的应用层级类别都是以Java撰写的,这些Java类别转译为Dex型式的Bytecode之后,必须仰赖Dalvik虚拟机器(VM: Virtual Machine)来执行之。 VM在Android平台里,扮演很重要的角色。此外,在执…...
计算机组成原理——存储系统(二)
🌱 "人生最深的裂痕,往往是光照进来的地方。 别怕脚下的荆棘,那是你与平庸划清界限的勋章;别惧眼前的迷雾,星辰永远藏在云层之上。真正的强者不是从未跌倒,而是把每一次踉跄都踏成攀登的阶梯。记住&am…...
CDDIS从2025年2月开始数据迁移
CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov,并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。...

