2 条题解

  • 0
    @ 2025-4-18 17:21:57

    滑动窗口 + map计数 ,还记得第二次课作业第 19题: 最长连续不重复子序列 吗?当时我们用了 桶计数 ,但是本题xi≤10^8 ,我们不可能采用 桶计数(爆空间) ,可以考虑使用 map计数

    • 0
      @ 2025-4-18 17:19:46
      #include <iostream>
      #include <unordered_map>
      #include <vector>
      using namespace std;
      
      int main() {
          ios::sync_with_stdio(false);
          cin.tie(nullptr);
          
          int n;
          cin >> n;
          vector<int> nums(n); // 改用vector,堆内存分配,支持1e6元素
          for (int i = 0; i < n; ++i) {
              cin >> nums[i];
          }
          
          unordered_map<int, int> lastPos;
          int left = 0, maxLen = 0;
          
          for (int right = 0; right < n; ++right) {
              int num = nums[right];
              // 关键修复:处理元素首次出现的情况(避免未初始化访问)
              if (lastPos.find(num) != lastPos.end() && lastPos[num] >= left) {
                  left = lastPos[num] + 1;
              }
              lastPos[num] = right; // 无论是否存在,直接更新(首次出现时插入)
              maxLen = max(maxLen, right - left + 1);
          }
          
          cout << maxLen << endl;
          return 0;
      }
      
      
      • 1

      信息

      ID
      4496
      时间
      1000ms
      内存
      512MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者