首页 > 试题广场 >

【模板】双指针

[编程题]【模板】双指针
  • 热度指数:118151 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}对于给定的长度为 n 的数组 \{a_1,a_2,\dots,a_n\} ,找出最长的区间,满足区间中元素两两不同
\hspace{15pt}如果有多个这样的区间,依次输出它们。

输入描述:
\hspace{15pt}第一行输入一个整数 n \left( 1 \leqq n \leqq 2 \times 10^5\right) 代表数组中的元素数量。
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n \left( 0 \leqq a_i \leqq n \right) 代表初始数组。


输出描述:
\hspace{15pt}第一行输出一个整数 m \left( 1 \leqq m \leqq n \right) 代表满足条件的区间数量。
\hspace{15pt}此后 m 行,每行输出两个整数 l,r \left( 1 \leqq l \leqq r \leqq n \right) 代表满足条件的区间。本题没有 \sf SPJ ,请按照 l 递增的顺序输出。
示例1

输入

6
1 1 4 5 1 4

输出

3
2 4
3 5
4 6
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>ans;
const int N=2e5+10;
int a[N],cnt[N];
int main(){
	int n,ma=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int r=1,l=1;r<=n;r++){
		cnt[a[r]]++;
		while(cnt[a[r]]>1)cnt[a[l]]--,l++;
		if(r-l+1>ma)ans.clear(),ma=r-l+1,ans.push_back(make_pair(l,r));
		else if(r-l+1==ma)ans.push_back(make_pair(l,r));
	}printf("%d\n",ans.size());
	for(auto [l,r]:ans)printf("%d %d\n",l,r);
	return 0;
}

发表于 今天 20:34:10 回复(0)
import java.util.*;
import java.io.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        // 注意 hasNext 和 hasNextLine 的区别
        int n = Integer.parseInt(bf.readLine());
        int[] chs = Arrays.stream(bf.readLine().split(" ")).mapToInt(
                        Integer::parseInt).toArray();

        Map<Integer,Integer> map=new HashMap<>();
        List<int[]> results=new ArrayList<>();
        int maxLen=0;
        int l=0;        

        for (int r = 0; r < n; r++) {
            //右侧先滑动
            map.put(chs[r],map.getOrDefault(chs[r],0)+1);

            //右侧元素个数大于1时,左侧收缩
            while(map.get(chs[r])>1){
                //左侧对应键计数更新
                map.put(chs[l],map.get(chs[l])-1);
                if(map.get(chs[l])==0){
                    map.remove(chs[l]);
                }
                l++;//左侧滑动
            }

            int cur=r-l+1;
            if(cur>maxLen){
                maxLen=cur;
                results.clear();
                results.add(new int[]{l+1,r+1});
            }else if(cur==maxLen){
                results.add(new int[]{l+1,r+1});
            }

        }

        System.out.println(results.size());
        results.forEach(item->System.out.println(item[0]+" "+item[1]));

    }
}

发表于 今天 11:33:58 回复(0)