- 题目
- 题解(20)
- 讨论(10)
- 排行
中等 通过率:18.60% 时间限制:4秒 空间限制:256M
知识点双指针

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
对于给定的长度为 nn 的数组 {a1,a2,...,an}{a1,a2,...,an} ,找出最长的区间,满足区间中元素两两不同。
如果有多个这样的区间,依次输出它们。
输入描述:
第一行输入一个整数 n(1≦n≦2×105)n(1≦n≦2×105) 代表数组中的元素数量。
第二行输入 nn 个整数 a1,a2,...,an(0≦ai≦n)a1,a2,...,an(0≦ai≦n) 代表初始数组。
输出描述:
第一行输出一个整数 m(1≦m≦n)m(1≦m≦n) 代表满足条件的区间数量。
此后 mm 行,每行输出两个整数 l,r(1≦l≦r≦n)l,r(1≦l≦r≦n) 代表满足条件的区间。本题没有 SPJSPJ ,请按照 ll 递增的顺序输出。
示例1
输入:
6
1 1 4 5 1 4
复制输出:
3
2 4
3 5
4 6
cpp
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
map<int, int> window_counts;
vector<pair<int, int>> result_intervals;
int max_len = 0;
int left = 0;
for (int right = 0; right < n; ++right) {
window_counts[a[right]]++;
while (window_counts[a[right]] > 1) {
window_counts[a[left]]--;
left++;
}
int current_len = right - left + 1;
if (current_len > max_len) {
max_len = current_len;
result_intervals.clear();
result_intervals.push_back({left + 1, right + 1});
} else if (current_len == max_len) {
result_intervals.push_back({left + 1, right + 1});
}
}
cout << result_intervals.size() << endl;
for (const auto& p : result_intervals) {
cout << p.first << " " << p.second << endl;
}
return 0;
}