- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试解决 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;
}
}
最佳答案
Kadane 的算法在这里不起作用,因为它涉及模运算的性质。
首先您必须了解 Kadane 算法为何有效:它是一个简单的动态规划,可以回答以下问题:
If we know the maximum sum end at index i-1, then maximum sum end at i is either append
a[i]
to the subarray yielding answer at i-1, OR not appending it
对于模块化算法,这是行不通的。例如:
Let A = {1,2,3,4}, M = 6
用Kadane的算法,最大和当然是把所有元素相加,用上面引述的思路可以求得:继续追加a[i]
进入之前找到的最大总和。
但是如果我们找到最大总和 % 6,那么答案是 (2+3)%6 = 5 而不是 (1+2+3)%6 = 0 或 (1+2+3+4)%6 = 4。maximum sum 越大 NOT IMPLIES 最大和 % M。因此,您的目标甚至不是找到最大总和。
这个问题可以在O(N lg N)
中解决使用 Kadane 算法的修改版本。
对于一个特定的索引i,
让DP(i)
= 最大子数组和 % M end at i
让PS(i)
是 prefix sum % M end at i
自然你会开始思考如何找到一些j < i
哪个(PS(i) - PS(j)+ M) % M
是最大值。 (假设您知道如何预计算 PS
和基本的模块化算法)
这里是核心部分:结果
DP(i) = max(PS(i), (PS(i) - PS(j) + M) % M
Where PS(j') is the smallest number larger than PS(i) out of all
j < i
为什么?因为看公式,如果PS(j') < PS(i)
, 那么当然最好 NOT TO 减去 PS(i)
中的任何内容.
但是如果PS(j') > PS(i)
,那么我们可以这样改写公式:(M - x)%M
, 那么我们要 x = PS(j')-PS(i)
越小越好,这样(M - x)%M
是最大的。
与 Kadane 的算法相同,我们会跟踪在此过程中找到的最大答案。
我们可以使用优先级队列或设置数据结构来找到这样的j'
对于所有 i
在线,实现O(N lg N)
总共。您可以在下面看到接受的代码的详细信息:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T;
set<LL> pre;
LL n, M, a[100010], ans, sum;
int main() {
cin >> T;
while(T--){
ans = sum = 0;
pre.clear();
cin >> n >> M;
for(int i=0; i<n;i++) cin >> a[i];
for(int i=0; i<n; i++){
(sum += a[i]) %= M;
ans = max(ans, sum);
ans = max(ans, (sum - *(pre.upper_bound(sum))+M)%M);
pre.insert(sum);
}
cout << ans << endl;
}
return 0;
}
关于c++ - 使用 Kadane 算法的最大子数组模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45025222/
我已经编写了 Kadane 算法,但不知何故它返回了错误的结果。不知道为什么。这是实现。基本上是在数组中找到“和最大的 ubarray” public class Kadane { publi
我将 Kadane 的算法修改为以下内容,这样即使在数组中包含所有负数的情况下它也能正常工作。 //Largest Sum Contiguous Subarray #include #include
尝试使用此处解释的 Kadane 算法:https://www.youtube.com/watch?v=OexQs_cYgAQ&t=721s 在这个数字数组中:[-5, 10, 2, -3, 5, 8
这个算法很有趣,我知道它被用于图像处理(可能还有其他场景),但我觉得奇怪的是这个算法也对负值进行操作,而负值在成像世界中几乎不存在其中有很多 unsigned int 来表示值。 您能否提供一个利用
假设 max_sequence(Array A):是 Kadane 算法的一个解。 你有一个数组:5,-3,-4,8,-1,12,-6,+4,+4,-14,+2,+8 然后将此数组缩短为正负序列的条纹
我正在研究 Kadane 的最大子数组问题算法。现在我从声明中了解到我们已经找到一个 子数组 的算法。子数组是否包含整个数组本身。 其实我在尝试下面的程序 int main(void)
算法说明:最大子数组问题给定一个由 n 个实数组成的序列 A(1) … A(n),确定一个连续的子序列 A(i) … A(j),其中子序列中的元素之和最大。 算法: int kadane(int a[
Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array (a) max
int array[] = {-1, 4, -2, 5, -5, 2, -20, 6}; 如果我有那个数组,我的 Kadane 算法实现可以找到最大子数组: int max_so_far = IN
有人可以告诉我 Kadane 算法中发生了什么吗?想检查我的理解。这就是我的看法。 你正在遍历数组,每次将 ans 变量设置为看到的最大值,直到该值变为负数,然后 ans 变为零。 与此同时,每次循环
这个问题在这里已经有了答案: Maximum sum sublist? (13 个答案) 关闭 8 年前。 我有以下 Kadane's algorithm 的实现求解数组的最大子数组问题: publ
我的算法如下所示: Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array
#include #include int MIN = std::numeric_limits::min() using namespace std ; void findMaxSubArray(
应用 Kadane 算法来获得最大乘积子数组似乎很棘手。虽然我能够获得最大乘积,但我并没有真正获得最大乘积子数组的正确范围。 http://www.geeksforgeeks.org/maximum-
我正在尝试解决 hackerrank 问题 - 最大子数组模 - 此处描述 https://www.hackerrank.com/challenges/maximum-subarray-sum/pro
这是 Kadane 算法的 Java 实现,用于查找具有最大和的连续子数组的和。 static int maxSum(int[] arr) { int maxEndingHer
我查找了寻找连续子数组最大和的最优解。还有一种算法叫做 Kadane 算法。这是我在 geeksforgeeks 上找到的伪代码。 Initialize: max_so_far = 0
我一直在尝试获取子数组的最大积的范围(为求职面试而学习)。 这已经在这里问过(但没有提供有效的答案)。 Getting range of max product subarray using Kada
public class Kadane { double maxSubarray(double[] a) { double max_so_far = 0; double max_e
我感觉Kadane的算法是最大子数组问题真动态规划解法的修改版。为什么我这么感觉?我感觉是因为计算最大子数组的方式可以采取: for(i=0;i using namespace std; int DP
我是一名优秀的程序员,十分优秀!