区间合并(c++,java)
给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n个整数(均在 0∼105范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤105
输入样例:
5
1 2 2 3 5
输出样例:
3
提交代码
c++
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
vector<PII> segs;
void merge(vector<PII> &s)
{
int st = -2e9, ed = -2e9;
vector<PII> res;
for (auto item:s)
{
if (ed < item.first)
{
res.push_back({
st, ed});
st = item.first, ed = item.second;
}
else ed = max(ed, item.second);
}
segs = res;
}
int main()
{
int n;
cin >> n;
while(n --)
{
int l, r;
cin >> l >> r;
segs.push_back({
l, r});
}
sort(segs.begin(), segs.end());
merge(segs);
cout << segs.size() << endl;
return 0;
}
java
import java.util.*;
public class Main
{
static int N = 100010;
static int [] a;
static ArrayList<int[]> list = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int i = 0; i < n; ++ i)
{
a = new int [2];
a[0] = in.nextInt();
a[1] = in.nextInt();
list.add(a);
}
list.sort(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
int k = 0;
int r = Integer.MIN_VALUE;
for (int a[]:list)
{
// 如果当前区间的左端点大于上一个区间的最右端
// 那么这个区间就是个独立的区间 不需要合并
if (a[0] > r) k ++;
r = Math.max(r, a[1]); // 更新右端点
}
System.out.println(k);
}
}