第一行输入一个整数
代表数组中的元素数量。
第二行输入
个整数
代表初始数组。
第一行输出一个整数
代表满足条件的区间数量。
此后
行,每行输出两个整数
代表满足条件的区间。本题没有
,请按照
递增的顺序输出。
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; }
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])); } }