【发布时间】:2017-12-14 23:10:40
【问题描述】:
我正在尝试解决hackerrank 问题-最大子数组模-在此处描述https://www.hackerrank.com/challenges/maximum-subarray-sum/problem。 我很好奇这个问题是否可以用 Kadane 算法解决。
目标:给定一个 n 元素整数数组和一个整数 'm' ,确定其任何子数组之和的最大值,取模为 'm'。
输入格式:
1) 第一行包含一个整数“q”,表示要执行的查询数。每个查询都用两行来描述:
a) 第一行包含两个以空格分隔的整数 描述 - 数组长度和模数。
b) 第二行包含用空格分隔的整数,描述 数组元素。
这是我想出的可能的 C++ 代码。某些测试用例失败(抱歉,测试用例太大,无法在此处发布)。您能否评论/评论为什么这可能不起作用?谢谢。
#include <bits/stdc++.h>
int main()
{
uint64_t q = 0, n = 0, m = 0;
std::cin >> q;
std::cin >> n;
std::cin >> m;
while(q) {
std::vector<uint64_t> vec;
for (uint64_t i = 0; i < n; i++) {
uint64_t num;
std::cin >> num;
vec.push_back(num);
}
uint64_t subArrayMax = 0;
uint64_t maxMod = 0;
for (uint64_t i = 0; i < n; i++) {
// Kadane's algorithm.
subArrayMax = std::max(subArrayMax, subArrayMax+vec[i]); // try (a+b)%m=(a%m+b%m)%m trick?
maxMod = std::max(maxMod, subArrayMax % m);
}
std::cout << maxMod;
--q;
}
}
【问题讨论】:
-
子数组需要连续吗?
-
试着找一个你的算法失败的小例子。比回到这个例子。
标签: c++ algorithm data-structures