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

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

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

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

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

例题: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.找到字符串中所有字母异位词

猜你喜欢

转载自blog.csdn.net/yzl1293346757/article/details/127869400