HJ178 【模板】双指针

  • 题目
  • 题解(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;
}
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集