我从leet code https://leet code . com/problems/Maximum-Sum-of-Two-Non-Overlapping-Subarrays/中看到“两个非重叠子数组的最大和(特定给定长度,数组只包含正数)”。
但我遇到了这个问题的一个变体——“两个非重叠子数组(任意长度)的最大和,并且该数组包含正数和负数”。我看不到任何编码平台有这个问题需要我确认我的解决方案。
我的理论解决方案:
>
创建一个名为“maxSumAtIndex”的新数组,并在每个索引处插入最大可能的总和。即如果前一个索引的值加上当前索引的值大于当前索引的值,则将该值插入当前索引中,或者仅插入当前索引的值。(
在数组“最大总和索引”(例如索引 10)中查找最大值的索引。从该索引回遍历(朝向索引 0),并得到第二高值的索引(比如索引 7)。原始数组中这 2 个索引(7 和 10)之间的值之和将给出其中一个子数组的总和。
另一个子数组位于0-6或11-20之间。在数组“maxSumAtIndex”(例如索引18)中查找这两个子数组中的最大值。从该索引(18)向后遍历到索引11,并找到11-20之间第二高值的索引(例如索引12)。原始数组中这两个索引(12和18)之间的值之和将给出第二个子数组的和。
finalSum = 步骤 (2) 的总和步骤 (3) 的总和
问题:
>
如果有任何平台有这个问题,我想知道。
我针对几个自制的测试用例运行了上述解决方案,它似乎有效。虽然我可以看到一种模式,这可能有效,但我无法弄清楚它为什么有效(就像外行证明一样)。这个解决方案是否正确,如果是正确的,为什么它有效?
-9 5 -9 -8 [9 7] -10 [10 9] = 35
-9 5 -4 -8 9 16 6 16 25
指数8最高25。索引7处的第二高16(第一次出现)。将原始数组的索引7到索引8相加-
最高 16 在索引 5.指数4位居第二,排名第二。将原始数组的索引 4 求和到索引 5 -
19 16 = 35
#include <bits/stdc++.h>
using namespace std;
//for the case when subarray size can be zero
int maxSubArraySum(vector<int> arr, int start, int end)
{
int max_so_far = arr[start], curr_max = arr[start];
for (int i = start + 1; i < end; i++)
{
curr_max = max(arr[i], curr_max + arr[i]);
max_so_far = max(max_so_far, curr_max);
}
return max_so_far > 0 ? max_so_far : 0;
}
int main()
{
int n;
cin >> n;
vector<int> arr(n);
for(int i=0; i<n, i++)
{
cin >> arr[i];
}
int ans = 0;
for(int i=0; i<n, i++)
{
int a = maxSubArraySum(arr, 0, i);
int b = maxSubArraySum(arr, i, n);
ans = max(ans, a + b);
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int>nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
vector<int>aagesekadane; //aagesekadane <=>kadaneFromFront
vector<int>pichesekadane(n); //pichesekadane <=>kadaneFromBack
int cs=0;
int ca=0;
aagesekadane.push_back(0);
pichesekadane.push_back(0);
for(int i=0;i<nums.size();i++){
cs+=nums[i];
if(cs>ca){
ca=cs;
}
if(cs<0)cs=0;
aagesekadane.push_back(ca);
}
cs=0;
ca=0;
for(int i=nums.size()-1;i>=0;i--){
cs+=nums[i];
if(cs>ca){
ca=cs;
}
if(cs<0)cs=0;
pichesekadane[i]=ca;
}
int ans=0;
for(int i=0;i<=n;i++){
ans=max(ans,aagesekadane[i]+pichesekadane[i]);
}
cout<<ans<<endl;
}
int main() {
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
希望这能奏效
我看不出有任何理由相信你的算法有效,但是一个简单的算法是运行Kadane的算法在每个位置之前找到最大和子数组,然后反向运行Kadane的算法以在每个位置之后找到最大的和子数组。
由于不相交的子阵列必须在某个位置的任一侧,因此只需检查所有位置,以找到前后最大和阵列的最大和。
我正在考虑这个leetcode问题,在完成这个天真的方法时遇到了一个问题。我在这里找到了一个最佳的解决方案。但我不确定我天真的尝试到底出了什么问题。 问题如下: 给定两个整数数组A和B,返回两个数组中出现的子数组的最大长度。 示例: 输入:A:[1,2,3,2,1]B:[3,2,1,4,7] 输出:3 说明:最大长度的重复子数组为[3,2,1]。 这是我当前的代码: 我的解决方案通过了几个测试用例
有人能为下面的问题提出一个简单的解决方案吗? 最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。 输入为:< code>array和< code>k。 例子: 输出: 2个 解释: 子数组:{1},{2},}3},1,2},2,3},{1,2,3} {1,2} =
A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1 到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!
例如:如果数组是[9,8,7,6,5,4,3,1,2,2],它应该返回46(长度为7的子数组[9,8,7,6,5,4,3]和长度为2的子数组[2,2]之和)。不能组合[9,8,7,6,5,4,3]和[1,2,2],因为这将产生长度为10的非素数的连续子数组(幂等性)。 有谁能解释一下如何使用DP来解决这类问题吗?多谢了。
我需要写一个函数,把一个正整数数组a、一个正整数B和一个正整数C作为输入。然后,函数应该返回长度为B和C的两个不相交子数组a的元素的总和,这些元素的总和最大化这些总和。例如,如果A=[3,11,1,2,9,4,5,6,1],B=4和C=2,那么函数应该返回38。这是因为A的长度为B和C的两个最大的不相交子数组是[9,4,5,6]和[3,11]。第一个子阵列的元素之和是9+4+5+6=24,第二个子
本文向大家介绍二叉树任意两个节点之间路径的最大长度?相关面试题,主要包含被问及二叉树任意两个节点之间路径的最大长度?时的应答技巧和注意事项,需要的朋友参考一下 考察点:树