双指针典型题(快慢指针)。
核心思路
使用两个指针 (slow
和 fast
):
1.fast
指针用于遍历数组。
2.slow
指针用于构建新数组(存储符合条件的元素)。
3.遍历数组时,将符合条件的元素通过 slow
覆盖到前方。
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
双指针算法解题总结
1. 常见题型
a.移除特定元素:如 removeElement
,移除数组中值为 val
的元素。
b.删除重复元素:如 removeDuplicates
,从有序数组中删除重复项。
2. 时间与空间复杂度
时间复杂度:O(n),遍历数组一次。
空间复杂度:O(1),仅使用常量空间。
典型问题扩展
1.移除重复元素(有序数组)
仅保留一个重复项:
if (nums[fast] != nums[slow - 1]) {
nums[slow] = nums[fast];
slow++;
}
保留两个重复项: 增加判断条件 slow < 2
或其他限制条件。
2.移动零问题
将所有的零移动到数组末尾,同时保持非零元素的相对顺序。
3.滑动窗口问题
在双指针基础上扩展,用于解决子数组和字符串相关问题。