题目要求
题目链接
思路参考自大佬的博客,此佬介绍了诸多解法,我学习了其中的 O ( N ) O(N) O(N)解法:
维护一个队列,让数组中的数依次入队,并记录其的元素和,若大于m,则让对首出列,更新答案,再让后面的数字继续入队,并更新答案,不断的这么操作,直到所有数字都入过队了为止。
妙哉!
按照大佬的思路写出了代码,对比了一下,可惜大佬给出的代码是有问题的,问题有二:
- 没初始化 (可能是故意的嘿嘿)
- 没有对尾部进行特判,导致漏解
我把完整AC的代码贴在下面了,自行食用,注释还是比较详细的,宁要是不想看我也没办法QAQ
AC代码#include
#include
using namespace std;
int nums[4000001];
// O(N)
int main() {
// 不初始化的都是SandBox
int n, m, left_result = 0, right_result = 0, sum_result = 0, left = 1, sum = 0;
cin >> n >> m;
// 题意下标从1开始
for (int i = 1; i > nums[i];
}
// 双端队列当队列用
deque queue;
// right指针和left指针就是要维护的区间
for (int right = 1; right m) {
// 出队
queue.pop_front();
// 溢出了表示可以更新答案,但更新前需要去掉这个溢出值
sum -= nums[right];
// 更新答案
if (sum > sum_result) {
sum_result = sum;
// 减去1是因为当前不能要,应该取上一个
right_result = right - 1;
left_result = left;
}
// 重新加上,不然就错过了
sum += nums[right];
// 删去左端点
sum -= nums[left];
// 出队后左端点右移一位
left++;
}
}
// 不加末尾特判的话,会忽略最后一次,会WA
// 测试样例:
// 10 50
// 2 2 1 9 7 8 8 3 9 5
// 输出:
// 3 10 50
if (sum > sum_result) {
sum_result = sum;
right_result = n;
left_result = left;
}
cout
关注
打赏
热门博文
- 【Linux】Ubuntu20.04安装和卸载MySQL8
- 【Linux】Ubuntu 20.04 报错 curl: (23) Failure writing output to destination 的解决方法
- 【Java】JUnit 4.13.2 警告 ‘assertEquals(double, double)‘ is deprecated 的解决方法
- 【JavaScript】处理 @parcel/transformer-js: Browser scripts cannot have imports or exports.
- 【Python】处理TypeError: Plain typing.NoReturn is not valid as type argument
- 【Python】Matplotlib可视化50例
- 【C语言】C语言修改MySQL数据库
- 【Java】从默认包导入类和对象报错的解决方法
- 【Java】panel.getGraphics()报错空指针异常的解决方法
- 【Java】IDEA编译Java项目报错 java: 找不到符号 的解决方法