一、问题背景
在很多场景中,我们可能会遇到如下问题:
给定一个整数数组,找到其中最长的包含 不重复元素 的子数组长度。
例如,输入数组为 [1, 2, 1, 3, 4, 2]
,我们可以找到的最长无重复子数组为 [2, 1, 3, 4]
,其长度是 4
。
这类问题可以通过滑动窗口(Sliding Window)算法进行高效求解。今天,我们将基于 C 语言的实现,从代码层面介绍如何使用简单的双指针技巧,快速解决这一问题。
二、核心思路
解决该问题的核心思路是使用滑动窗口算法:
-
滑动窗口定义:
利用两个指针(i
和j
)控制一个动态区间(窗口),该区间包含不重复元素。 -
窗口的扩展与缩小:
- 扩展:右边界(
i
)不断向右移动,尝试将新的元素加入窗口。 - 缩小:如果新加入的元素导致窗口内出现重复元素,则需要移动左边界(
j
),排除重复的元素,直到窗口恢复为无重复状态。
- 扩展:右边界(
-
频率统计:
使用一个辅助数组s
记录窗口内各元素的出现次数,以方便判断某元素是否重复。 -
最大长度记录:
每次窗口中不存在重复元素后,将当前窗口长度进