可以使用滑动窗口算法。
让我们举一个例子:
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
>
,每次在计算最大值=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。 我们是否可以添加其他聪明的程序来进一步减少设置?