当前位置: 首页 > 知识库问答 >
问题:

给定元素数的最大子数组

谷梁弘深
2023-03-14

共有1个答案

方谦
2023-03-14

可以使用滑动窗口算法

让我们举一个例子:

Original array : 4 -2 6 -10 13 8
Window size    : k = 3
maximum = -inf

在每次迭代中,您必须计算当前窗口的值,并检查它是否是最大值。

1st window is : |4 -2 6| -10 13 8  
window sum = 8  
maximum = max(-inf , 8) = 8
2nd window is : 4 |-2 6 -10| 13 8  
Window sum = 8 - 4 + (-10) = -6  
maximum = max(8 , -6) = 8
3rd window is : 4 -2 |6 -10 13| 8  
Window sum = -6 - (-2) + 13 = 9  
maximum = max(8 , 9) = 9

4th window is : 4 -2 6 |-10 13 8|  
Window sum = 9 - 6 + 8 = 11  
maximum = max(9 , 11) = 11

>

  • 必须存储上一个窗口的减去元素的总和
  • 如果减去的元素的和变为负数,则使其为0,否则保持原样
  • ,每次在计算最大值=max(current_max,sum)时,将其更改为

    maximum=max(current_max,sum+subtracted_element's_sum)

    仅此而已:)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        int i,j,n,k,x,y;
        cin>>n>>k;
        vector<int>v;
        for(i=0; i < n; i++)
        {
            cin>>x;
            v.push_back(x);
        }
        int sum = 0, prev_sum = 0;
        for(i=0;i<k;i++) // Calculating sum of first window
          sum += v[i];
        int maximum = sum;
        for(i = 1; i + k <= n; i++)
        {
            sum = sum - v[i-1] + v[i+k-1]; // Calculating sum of the next windows
            prev_sum += v[i-1]; // Storing previous subtracted elements sum
            if(prev_sum < 0) // Checking if previous sum becomes negative. If so then make it 0, otherwise skip
              prev_sum = 0;
            maximum = max(maximum, sum + prev_sum); // Saving maximum window sum
        }
        cout<<maximum<<"\n";
    }
    

  •  类似资料:
    • 我的问题很简单,但我不知道如何解决我想要的。我必须找到小于给定数字的最大数素数,如果不存在则打印消息。 代码是有效的,如果数字是10,它会打印7,但我想做2个新的修改,我找不到解决方案。例如,如果给定的数字是1,我的程序应该如何修改以打印消息?我试着写一个if-else,但是如果我用if修改了while,这将不会有帮助。第二件事,如果给定的数是素数,代码仍然会找到比给定数少的数。如果我给数字7,输

    • O(n^2)算法简单。有没有人对此有更好的算法?

    • 有没有一种方法可以在小于O(n^2)的时间内做到这一点。 O(nlogn)还是O(n)?

    • 如果某些数组索引不能配对,我将如何找到唯一正整数数组的最大和? 例如,我们有一个数组:[8,2,1,3,9,4] 索引(0,4)和(4,5)处的元素彼此不喜欢。 在这种情况下,最大和为:8 2 1 3 4=18 假设这是100个条目的规模和多达一半的约束,您将如何处理这个问题? 是否有一个像图形这样的数据结构是有用的还是有一些DP?我主要关心的是高效的运行时。

    • 这个问题有多项式解吗?如果有,你能呈现吗?

    • 给定一个数N,我们如何求最大P*Q null 因此,暴力解决方案起作用。 再进一步,我们看到Q_max<=n/2,如果我们确实同意P =√n。 我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。 这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。 我们是否可以添加其他聪明的程序来进一步减少设置?