สมมติว่าเรามีอาร์เรย์วงกลม C ของจำนวนเต็มที่แสดงโดย A เราต้องหาผลรวมสูงสุดของอาร์เรย์ย่อยที่ไม่ว่างเปล่าของ C นอกจากนี้ อาร์เรย์ย่อยอาจรวมแต่ละองค์ประกอบของบัฟเฟอร์ A คงที่ได้ไม่เกินครั้งเดียวเท่านั้น หากอาร์เรย์เป็นแบบ [1,-2,3,-2] ผลลัพธ์จะเป็น 3 เนื่องจากอาร์เรย์ย่อย[3] มีผลรวมสูงสุด 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของวี
-
สร้างอาร์เรย์ leftSum, leftSumMax, rightSum, rightSumMax ทุกขนาด n
-
leftSum[0] :=v[0], leftSumMax[0] :=สูงสุด 0 และ v[0]
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
leftSum[i] :=leftSum[i - 1] + v[i]
-
leftSumMax[i] :=สูงสุดของ leftSum[i] และ leftSumMax[i - 1]
-
-
rightSum[n - 1] :=v[n - 1], leftSumMax[n - 1] :=สูงสุด 0 และ v[n - 1]
-
สำหรับฉันอยู่ในช่วง n - 2 เหลือ 0
-
rightSum[i] :=rightSum [i + 1] + v[i]
-
rightSumMax[i] :=สูงสุดของ rightSum[i + 1] และ rightSum Max[i]
-
-
leftAns :=leftSum[0] + rightSumMax[1]
-
สำหรับผมอยู่ในช่วง 1 ถึง n – 2
-
leftAns :=สูงสุดของ leftAns, leftSum[i] + rightSumMax[i + 1]
-
-
rightAns :=rightSum[n - 1] + leftSumMax[n - 2]
-
สำหรับฉันอยู่ในช่วง n - 2 เหลือ 1
-
rightAns :=สูงสุดของ rightAns, rightSum[i] + leftSumMax[i - 1]
-
-
curr :=v[0], kadane :=v[0]
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
curr :=สูงสุดของ v[1], curr + v[i]
-
kadane :=สูงสุดของ curr และ kadane
-
-
คืนค่าสูงสุดของ leftAns, rightAns และ kadane
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxSubarraySumCircular(vector<int>& v) {
int n = v.size();
vector <int> leftSum(n),leftSumMax(n),rightSum(n), rightSumMax(n);
leftSum[0] = v[0];
leftSumMax[0] = max((int)0,v[0]);
for(int i =1;i<n;i++){
leftSum[i] = leftSum[i-1] + v[i];
leftSumMax[i] = max(leftSum[i],leftSumMax[i-1]);
}
rightSum[n-1] = v[n-1];
rightSumMax[n-1] = max((int)0,v[n-1]);
for(int i =n-2;i>=0;i--){
rightSum[i] = rightSum[i+1]+v[i];
rightSumMax[i] = max(rightSumMax[i+1],rightSum[i]);
}
int leftAns=leftSum[0]+rightSumMax[1];
for(int i =1;i<n-1;i++){
leftAns = max(leftAns,leftSum[i]+rightSumMax[i+1]);
}
int rightAns = rightSum[n-1]+leftSumMax[n-2];
for(int i =n-2;i>=1;i--){
rightAns = max(rightAns,rightSum[i]+leftSumMax[i-1]);
}
int curr=v[0];
int kadane = v[0];
for(int i =1;i<n;i++){
curr = max(v[i],curr+v[i]);
kadane = max(curr,kadane);
}
return max(leftAns,max(rightAns,kadane));
}
};
main(){
vector<int> v = {1,-2,3,-2};
Solution ob;
cout << (ob.maxSubarraySumCircular(v));
} อินพุต
[1,-2,3,-2]
ผลลัพธ์
3