数组中的碰撞指针与滑动数组问题

本文介绍了碰撞指针(双向指针)在数组问题中的应用,如在LeetCode167题中寻找两数之和。碰撞指针通过两个指针从数组两端向中间遍历,适用于验证回文串等场景。同时,讲解了滑动窗口的概念,以LeetCode209题为例,展示了如何通过调整两个指针来找到满足条件的最小子数组。滑动窗口在处理连续子数组问题时非常有效,如查找最长无重复字符子串等。
摘要由CSDN通过智能技术生成

碰撞指针(双向指针)问题

       碰撞指针时双指针的应用,核心思想是通过两个指针分别指向数组的头和尾,两个指针分别从头从尾开始向中间遍历,直到两个指针相遇。

        在遇到需要同时比较数组前后的位置的数时就需要使用碰撞指针,比较典型的案例例如验证回文串

        在使用碰撞指针时需要注意的问题是,移动前后两个指针的条件,在逻辑判断中最主要的一步,何时移动以及满足什么条件时移动,然后先移动前后

例题:LeetCode 167. 两数之和 II - 输入有序数组

        给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

        

        该题的解题思路是计算i与j指针指向的数字之和,如果和刚好等于目标值则返回i与j索引,如果和大于目标值则移动j指针,如果和小于目标值则移动i指针,当i与j相遇的时候结束移动

类似例题:

LeetCode 125. 验证回文串

LeetCode 344. 反转字符串

LeetCode 345. 反转字符串中的元音字母

LeetCode 11. 盛最多水的容器

滑动窗口问题

        滑动窗口也是双指针的应用,是双向指针问题的拓展,滑动窗口是指使用两个指针指向数组中的两个索引,代表一个索引的区间,在遍历数组时通过变换两个指针索引获取特定数组区间内的数来完成处理指定的问题

例题:LeetCode 209.长度最小的子数组

        给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

        该例题使用滑动窗口的核心思想:通过两个指针指向数组的不同索引,该索引对应的区间即为子数组,通过计算子数组的值来移动窗口的左右指针

 

                                                上图演示的是滑动窗口的前几步

        只需要通过两个索引对应区间内的值的和进行判断,如果大于target值那就移动i指针(使sum值变小),如果小于target值就移动j指针(使sum值变大),直到j指针指向数组外时停止移动即可。

         滑动窗口的核心方法就是移动一个区间,使用区间内的数据来解决问题

类似的题目有:

LeetCode 3.无重复字符的最长子串

LeetCode 438.找到字符串中所有字母异位词

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值