You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

最长无重复元素子数组C++代码仅过25%用例问题排查

问题分析
  • 你的解法错误核心原因:遇到重复元素时直接清空所有已存入的城市记录,这种操作会丢失当前重复位置之前、未和当前元素冲突的无重复连续序列,导致统计的最大长度偏小。
  • 复现错误的测试用例:n=5,数组为[1,2,1,3,4],正确最长无重复子数组是[2,1,3,4],长度为4。你的代码遇到下标为2的1时,直接清空set,丢失了未冲突的元素2,最终统计得到的最大长度只有3,和正确结果不符。
正确解法思路

这个问题确实是经典的「最长无重复元素子数组」问题,应该用滑动窗口(双指针) 实现:

  • 维护左右两个指针表示当前无重复子数组的左右边界
  • 用哈希表/数组记录每个城市最后一次出现的下标
  • 遍历过程中如果当前城市已经出现过,且最后一次出现的位置在当前窗口内,就把左指针移动到该城市上一次出现位置的下一位
  • 每次遍历更新当前城市的最后出现位置,同时计算当前窗口长度,更新最大值
修正后的代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    vector<int> cities(n);
    for(int i = 0; i < n; i++)
    {
        cin >> cities[i];
    }
    int maxLength = 0;
    int left = 0;
    unordered_map<int, int> lastPos; // 存储每个城市最后出现的下标
    for(int right = 0; right < n; right++)
    {
        // 如果当前城市在当前窗口内出现过
        if(lastPos.count(cities[right]) && lastPos[cities[right]] >= left)
        {
            left = lastPos[cities[right]] + 1;
        }
        lastPos[cities[right]] = right;
        maxLength = max(maxLength, right - left + 1);
    }
    cout << maxLength << endl;
    return 0;
}

如果要进一步优化性能,因为题目限定1 < S[i] < N,可以用长度为N的数组代替unordered_map,访问速度更快。

内容的提问来源于stack exchange,提问作者MassSpectrometer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:45:05