Leetcode 对撞指针

『算法』——双指针算法——快慢指针/对撞指针/滑动窗口(快慢指针的一种) 双指针算法引言1、对撞指针2、快慢指针3、滑动窗口 引言 什么是双指针? \quad \quad严格的来说,双指针只能说是是算法中的一种技巧。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。 \quad \quad双指针算法在一些数组题中很常用,双指针算法有两种形式,一种被称为对撞指针,两个指针从两端向中间靠拢;另一种是快慢指针,两个指针向统一方向运动,滑动窗口方法就是一种常用的快慢指针方法。 快慢 阅读详情

问题特征

该类问题特点为最优解由数组上的两个位置A和B对应的值的某种关系构成(如:和为某值)。这类问题可以首先在数组两端分别设立两个指针,当其中一个满足某种条件的指针(如:A对应的值大于B指针对应值)固定时,另一指针无论如何改变都无法得到更优解,此时只能改变指针A的位置来搜索更优解。

Leetecode 167

167.Two Sum II - Input array is sorted
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
Example 1:
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2.

  • 思路:
    由于数组已经升序排列,所以当和数较大时,右移left指针;反之,左移right指针。
vector<int> twoSum(vector<int>& numbers, int target) {
    int left = 0;
    int right = numbers.size() - 1;
    while (left < right) {
        int sum = numbers[left] + numbers[right];
        if (sum == target) {
            int res_arr[] = {left + 1, right + 1};
            vector<int> res(res_arr, res_arr + 2);
            return res;
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    // no solution
    throw invalid_argument("The input has no solution!");
}

Leetcode 125

125. Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: “A man, a plan, a canal: Panama”
Output: true

  • 思路:
    使用对撞指针,注意点为isalnum()函数和toupper()或tolower()函数的使用,时问题简化。
bool isPalindrome(string s) {
    int left = 0;
    int right = s.length() - 1;
    while (left < right) {
        if (!isalnum(s.at(left))) {
            left++;
            continue;
        }
        if (!isalnum(s.at(right))) {
            right--;
            continue;
        }
        if (tolower(s.at(left)) != tolower(s.at(right)))
            return false;
        left++;
        right--;
    }
    return true;
}

Leetcode 345

345. Reverse Vowels of a String
Write a function that takes a string as input and reverse only the vowels of a string.
Example 1:
Input: “hello”
Output: “holle”

  • 思路
    使用对撞指针方法,注意set对象的使用。
set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}; 
string reverseVowels(string s) {
    int low = 0;
    int high = s.length() - 1;
    int start = low;
    int end = high;
    while (true) {
        while (start <= high && vowels.find(s.at(start)) == vowels.end()) start++;
        while (end >= low && vowels.find(s.at(end)) == vowels.end()) end--;
        if (start >= end) break;
        swap(s.at(start++), s.at(end--));
    }
    return s;

Leetcode 11

11. Container With Most Water
Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of the line i is at (i, ai) and (i, 0). Find two lines, which, together with the x-axis forms a container, such that the container contains the most water.
Notice that you may not slant the container.
Example 1:
在这里插入图片描述
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

  • 思路
    本题使用对撞指针,当固定最小一条边时,移动另一边并不能增加体积,无法获得更优解,所以符合对撞指针特征。
int area(vector<int>& height, int left_idx, int right_idx) {
    int h = height[left_idx] < height[right_idx] ? height[left_idx] : height[right_idx];
    int area = h * (right_idx - left_idx);
    return area;
}
int maxArea(vector<int>& height) {
    int low = 0;
    int high = height.size() - 1;
    int left = low;
    int right = high;
    int maxArea = area(height, left, right);
    while (left < right) {
        height[left] < height[right] ? left++ : right--;
        int tempArea = area(height, left, right);
        if (tempArea > maxArea)
            maxArea = tempArea;
    }
    return maxArea;

Leetcode 16

16. 3Sum Closest
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example 1:
Input: nums = [-1,2,1,-4], target = 1
Output: 2
Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

  • 思路:
  1. 排序,目的是使用对撞指针;
  2. 固定一个数,将该问题转化为2Sum问题,使用对撞指针来解决;
  3. 首先寻找最接近的3数字和,然后根据距离对指针进行移动;
int my_abs(int num) {
    return num < 0 ? -num : num;
}
int threeSumClosest(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int res = nums[0] + nums[1] + nums[2]; // init
    for (int i = 0; i < nums.size() - 2; ++i) {
        int left = i + 1;
        int right = nums.size() - 1;
        while (left < right) {
            int tmp = nums[i] + nums[left] + nums[right];
            if (my_abs(tmp - target) < my_abs(res - target)) {
                res = tmp;
            }
            if (tmp > target)
                --right;
            else if (tmp < target)
                ++left;
            else
                return tmp;
        }
    }
    return res;
}
诠视MR眼镜Unity开发设置_Unity2020.3.38 请按照如下设置Android SDK 和 Gradle。打包前先将Unity切换到Android模式。Preferences 设置。 阅读详情

相关推荐

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 705

初入算法-对撞指针原理分析

前言 对撞指针常用作有序数组的元素查找,使用两个指针分别从头尾往中间进行迭代,相遇时终止。 刚接触对撞指针时,笔者对其算法原理有些怀疑:由于这两个指针不能“后退”,如何确保在迭代时,不错过有效值呢?下面尝试给与一些数学证明,以供理解。 证明 如图,设ab值为有序数组N中存在的两个有效值,即: a+b=target(1) a + b = target \tag{1} a+b=target(1) 现在证明,对撞指针从两端往中间迭代时,左指针不会错过a值,右指针不会错过b值。 设a值的左边界L1,b值的右边

weixin_43445477的博客 498

Anomalib实战指南:从零开始构建自定义异常检测数据集

本文提供了一份详细的Anomalib实战指南,指导用户从零开始构建自定义异常检测数据集。文章深入解析了数据准备的核心步骤、目录结构规范,并对比了PatchCore与FastFlow等关键模型的适用场景。通过清晰的代码示例,手把手演示了环境配置、模型训练与推理评估的全流程,旨在帮助开发者快速掌握这一工业视觉异常检测利器,有效解决实际生产中的缺陷识别难题。

weixin_29054245的博客 643

【算法】关于双指针的奇技淫巧(一):对撞指针

说明两数之和应该还要往上增加,而此时尾指针所指向的数已经是最大了,所以需要让头指针往右移动才可以使得两数之和往上增加,继而推断出头指针所指向的“2” 与尾指针指向的“6、10、12、15”都不符合,因为“15”已经是最大都不符合目标数,其他比它小的数就更不用说。10 + 15 = 25 > 22,只要看明白上面说的原理,这里理解起来也很简单,就是。判断一下当前数值相加是否符合目标数,2 + 15 = 17 > 9 ,两数之和比目标数要大,所以要让两数之和减少,因为头指针所指向的数已经是最小的了。

师兄怎么办 828

AI开发助手介绍

AI开发助手介绍随着NLP方向发展越来越成熟,AI写代码领域出现了几个非常好的模型,今天笔者给大家推荐几个AI Coding 助手AI Coding助手是以IDEA插件或vim插件形式提供服务,在编辑器中写代码时,可以实时预测下一行要输入的代码,提升开发效率。Github Copilot首先要介绍的是Github Copilot,Copilot是个AI Coding助手,它从注释和代码中提取上下文,给出单行和整个函数的代码建议,Copilot由Open AI 的CodeX模型提供支持,它是一个由OpenAI

bobo_simpler的博客 5766

Vue - 萤石云监控 ezuikit 视频实例销毁方案,解决使用stop方法无法销毁EZUIKit实例或销毁后依然占用内存并且监控画面依然有声音问题(解决页面多个监控摄像头画面同时播放,翻页或关闭页

vue2,vue3,萤石,监控摄像头,萤石云销毁视频实例,退出页面销毁,stop销毁原视频流,占用内存怎么办,销毁后视频依旧在后台播放有声音,销毁视频播放器,页面上有多个视频画面怎么销毁某一个,stop方法不生效怎么办,浏览器非常卡,dom销毁,ezuikit-js萤石云播放器Vue中使用beforeDestory销毁播放器实例,调用萤石云ezuikit-js的视频对象销毁,vue使用萤石云监控视频录像回放,不销毁实例会出现离开页面后依旧有监控声音并且占内存问题,不好使,页面崩了,崩溃,视频监控太多,没有用

🏆 前端领域优质创作者 1万+

双指针(Two Pointers)用法精讲及解题案例

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞指针」。如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。在数组的区间问题上,暴力算法的时间复杂度往往是 $O(n^2)$。而双指针利用了区间「单调性」的性质,可以将时间复杂度降到 $O(n)$。双指针分为「对撞指针」、「快慢指针」、「分离双指针」。对撞指针:两个指针方向相反。

白话机器学习 5196

【DRAM存储器三十五】LPDDR4介绍--主要技术特性之VREF training,为什么要做VREF training?

详述DDR4、LPDDR4需要做vref training的原因和训练过程

highman110的博客 2918

Leetcode | 对撞指针算法笔记

首先简要介绍了对撞指针的基本思想和应用场景,然后对Leetcode网中相关的对撞指针算法题目使用Python代码进行了实现,同时对代码的时间复杂度(包含平均情况、最好情况和最坏情况)和空间复杂度进行了简要的分析

是希望的博客 645

Codex 实战 Skills:自动采集一天之内的 Git 提交,一键排版成精美工作日报并发送邮件

特性手动撰写脚本辅助(仅聚合)AI 增强自动化(本文方案)时间成本高(30-60分钟/天)中(5-10分钟/天)低(<1分钟/天)内容质量依赖个人总结能力原始数据堆砌,缺乏提炼专业、结构化、有业务视角信息完整性易遗漏完整,但难以阅读完整,且经过分类筛选维护成本无低中(需维护 Skill 配置)可扩展性低中高(可轻松添加周报、月报)适用场景所有开发者初级开发者追求效率的高级开发者本文详细介绍了一种基于 Codex Agent Skills 的自动日报生成方案。

yueyeguzhuo的专栏 102

Vue3 - 强力解决前端下载二进制流pdf文件、下载成功后打开空白问题解决,或者获取PDF文件流,将blob对象转换成下载链接打开后一片空白(无论是否使用pdf插件下载,还是原生方法下载都完美解决)

vue3前端下载二进制流pdf文件,下载成功,打开空白问题解决,js下载PDF文件流,打开空白问题,VUE3 h5中的文件流下载和指定的url下载总结(解决下载后的pdf打开空白情况)pdfjs打开文件流空白,解决pdf文件流,预览全是空白页,pdf文件流,下载正常,但是预览全是空白页,前端JS获取PDF文件流,将blob对象转换成下载链接打开后一篇空白的问题,前端文件流下载后文件空白,前端下载文件流PDF文件显示空白 或 无法打开,在线预览PDF文件打不开白屏怎么办,前端axios请求二进制数据流转换生成

🏆 前端领域优质创作者 4618

27.力扣LeetCode_对撞指针边界处理

这篇文章分析了两类双指针解法在移除数组元素时的边界条件差异。情形一使用left=0和right=numsSize-1的初始值;情形二则使用right=numsSize。两种方法都通过移动指针来覆盖需要删除的元素,但边界处理不同:情形一right指向最后一个未验证元素,情形二right指向其右边界。

2401_82472941的博客 350

(4-2)A*

实际已经花费的代价(g(n)):从起点到当前节点n的实际路径代价。启发式估计的剩余代价(h(n)):从当前节点n到目标节点的估计路径代价。这是A算法的关键之一,启发式函数要足够接近实际代价,但又要高效计算。如果启发式函数等于0,A算法就相当于Dijkstra算法。实现A*算法的核心步骤如下所示。(1)初始化:将起点加入开放列表(open list),并将其f值设为g值和h值的和。(2)循环:从开放列表中选择具有最小f值的节点作为当前节点。如果当前节点是目标节点,算法结束;

码农三叔 1807

题解 力扣 LeetCode 42 接雨水 双指针 滑动窗口 对撞指针 C++

这题暴力一下就能过的,还有双指针-对撞指针的优化版本,感兴趣的可以去搜一下 这里介绍一种双指针-滑动窗口的写法 思路: 每轮操作找一个 "凹陷处",并统计。"凹陷处" 找法: 先找凹陷处左侧最高点,若满足 i

qwq_ovo_pwp的博客 954

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode对撞指针汇总

题目来源: leetCode 344,345,11 自我感觉难度/真实难度: 写题时间时长:2 题意: 分析: 都是使用对撞指针的技术 自己的代码: 代码效率/结果: 优秀代码: 11题 class Solution(object): def maxArea(self, a): """ :ty...

weixin_30484247的博客 235

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

对撞指针的学习——以LeetCode第15题为例

引言 在进行LeetCode题库作答过程中,遇到了多个双指针的问题,遂进行学习。 初步了解到,双指针方法为针对有序数组的遍历的一种方法,可分为快慢指针与对撞指针。相比简单的遍历,双指针可更快的达到结果。 对撞指针原理 对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。 伪代码如下: function 对撞指针 (list) { var left = 0; var right = list.length - 1;

weixin_44585267的博客 7186

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【leetcode】对撞指针题目总结

【代码】【leetcode】对撞指针题目总结。

Smile&搁浅 378

力扣(四)查找-对撞指针

对撞指针 leetcode1、两数之和leetcode 1、两数之和leetcode1、两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: # 记录索引

xuhong_001的博客 242

力扣算法题总结-滑动窗口,对撞指针(二)

滑动窗口 209-Minimum Size Subarray Sum (对于滑动窗口和对撞指针的相似之处的理解) 3-Longest Substring Without Repeating Characters 340-Longest Substring with At Most K Distinct Characters 对撞指针 1-Two Sum 167-Two Sum II (1题目的升级,说明了暴力解法以及优化解法的本质) 15-3Sum 16-3Sum Closest 18-4Sum (kSum

qq_44744586的博客 358

Leetcode对撞指针

先从一个简单的例子开始,给定一个排序好的数组,int nums[] = {-2, 0, 1, 3},求出两两之和为target(target = 1)的组合。 最开始学习对撞指针非常疑惑的地方就在于,除了-2 + 3 = 1,还有0 + 1 = 1。因为对撞指针解决的往往并不是唯一解问题。 假设l = 0, r = n - 1 = 3,nums[l] + nums[r] == ...

diluan3462的博客 261

[LeetCode解题]--对撞指针

LeetCode 第 11 125 167 344 345 属于一类问题---数组相关的 “对撞指针”。 一、_11_ContainerWithMostWater 二、 _125_ValidPalindrome 三、_167_TwoSumIIInputArrayisSorted 四、_344_ReverseString 五、_345_ReverseVowelsofaString ...

zhanggf的博客 408

Python对撞指针(力扣)

个人感觉今天的内容和折半是一样的,内容不难。读者如有任何问题欢迎私信我。今天终于做了以前想了很久但都没有去做的事,后续我的博客预计将分类持续更新:1.力扣题目讲解2.Python语言基础3.数据结构与算法4.数学建模(与数学竞赛)5.深度学习(神经网络)(基于tensfolw)6.计算机视觉(opencv)

qq_64334741的博客 967

对撞指针思想解LeetCode 167&125&344&345&11&15

167 思想:找到的两个数一定是一左一右的。 Nums[i]+nums[j]<target:i++ Nums[i]+nums[j]>target:j-- 直到nums[i]+nums[j]=target class Solution { public: vector<int> twoSum(vector<int>& numb...

与 632

【Leetcode】编程实践学习Task04:查找——对撞指针

Task 04:对撞指针 练习题合集 leetcode 1、15、18、16、454、49、447、149 leetcode 1. 两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例 : 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回

red_velvet_cake的博客 213

LeetCode—3.双指针算法—对撞指针与快慢指针及其leetcode题

文章目录引言一、对撞指针二、快慢指针三、LeetCode—167其他用到对撞指针的问题四、LeetCode—142 引言   双指针算法在数组问题中极为常用。双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。 一、对撞指针   对撞指针法,顾名思义,就是指针在两边往中间撞。见三 二、快慢指针   快慢指针可以理解为:一个跑的快的人和一个跑的慢的人在一个圆形的赛道上赛跑,在某个时刻,跑得快的人一定会从后面赶上跑得慢的人。快指针fast一次走两步,慢指针slow一次走一步,最终会相遇在环中的某个

柳杰的博客 444

【力扣】881. 救生艇 <对撞指针>

【力扣】881. 救生艇

学习笔记 198
上一篇: 打造可在SSH远程登录中使用的Vim IDE配置
下一篇: Leetcode题解连接
mathnan
博客等级 码龄18年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值