文章目录
题目描述
给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。
数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。
求一组连续子序列,组内子序列的数目最多。
输出这个数目。
输入描述
第一行输入为数组长度N,1<=N<=10^3
第二行为N个用空格分开的整数 Ci,-10^5 <= Ci <= 10^5
输出描述
第一行是一个整数M,表示满足要求的最多的组内子序列的数目。
用例
输入 | 10 8 8 9 1 9 6 3 9 1 0 |
输出 | 4 |
说明 | 四个子序列的第一个元素和最后一个元素的下标分别为 2 2 4 4 5 6 7 7 |
输入 | 10 -1 0 4 -3 6 5 -6 5 -7 -3 |
输出 | 3 |
说明 | 三个子序列的第一个元素和最后一个元素的下标分别为: 3 3 5 8 9 9 |
题目解析
最简单的:
如果不考虑复杂度,使用两个for循环来暴力求解所有的连续子序列,因为长度只有1000个。应该不会超时!
如果怕超时,可以使用动态规划前缀和来解:
1、将和相同的连续子序列的区间统计在一起
2、求解每个“和” 下的最大不相交区间数量,保留最大数量作为题解
假设不相交区间数量为count,则至少为1
1、先将多个区间,按照右边界升序
2、然后取排序后第一个区间的右边界作为 t,并遍历之后的下一个区间[l, r]:
- 如果 l <= t,则说明当前两个区间有交集,则舍弃遍历的区间,继续遍历下一个区间
- 如果 l > t,则说明当前两个区间无交集,即不相交,此时 t = r,并且不相交区间数量count++,然后继续下一次遍历
这样最后得到的不相交区间数量count,就是最大不相交区间数量
C++
#include <iostream>
#include <vector>
#include <map>
using namespace std;
//移除有交集的序列
int removeIntersect(vector<vector<int>> list) {
int res = 0;
for (int i = 0; i < list.size(); i++