สมมติว่าเราได้ให้อาร์เรย์ของจำนวนเต็ม A และให้ n คือความยาวของอาร์เรย์ A ตอนนี้ถือว่า Bk เป็นอาร์เรย์ที่ได้รับจากการหมุนอาร์เรย์ A ตำแหน่ง k ตามเข็มนาฬิกา ที่นี่การหมุนสามารถกำหนดเป็น −
-
F(k) =0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1].
ตอนนี้หาค่าสูงสุดของ F(0), F(1), ..., F(n-1)
ดังนั้นหากอินพุตเป็น A =[4,3,2,6] แล้ว −
-
F(0) =(0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) =0 + 3 + 4 + 18 =25
-
F(1) =(0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) =0 + 4 + 6 + 6 =16
-
F(2) =(0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) =0 + 6 + 8 + 9 =23
-
F(3) =(0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) =0 + 2 + 12 + 12 =26
สูงสุดคือ 26
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของอาร์เรย์ A ถ้า n เป็น 0 ให้คืนค่า 0
-
ret :=0 สร้างอาร์เรย์ขนาด n สองอาร์เรย์ เหล่านี้คือขวาและซ้าย
-
left[0] :=A[0]
-
สำหรับผมอยู่ในช่วง 1 ถึง n – 1
-
left[i] :=left[i] + left[i – 1]
-
left[i] :=left[i] + A[i]
-
-
right[n – 1] :=A[n – 1]
-
สำหรับฉันอยู่ในช่วง n – 1 ลงไปที่ 0
-
right[i] :=right[i] + right[i + 1]
-
right[i] :=right[i] + A[i]
-
-
rightMul :=0, cnt :=n – 1
-
สำหรับฉันอยู่ในช่วง n – 1 เหลือ 1
-
rightMul :=rightMul + A[i] * cnt
-
ลดลง 1
-
-
สร้างอาร์เรย์ x ขนาด n
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 2
-
x[i] :=rightMul
-
rightMul :=rightMul – ขวา[i + 1]
-
-
leftMul :=0, cnt :=1
-
สำหรับฉันอยู่ในช่วง 0 ลงไปที่ n – 2
-
leftMul :=leftMul + A[i] * cnt
-
เพิ่มขึ้นอีก 1
-
-
ลดลง 1
-
สำหรับฉันอยู่ในช่วง n – 1 เหลือ 1
-
x[i] :=x[i] + leftMul
-
leftMul :=leftMul – A[i – 1] * cnt
-
ถ้า i – 2>=0 แล้ว leftMul :=leftMul + left[i – 2]
-
-
ผลตอบแทนสูงสุดของ x
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int maxRotateFunction(vector<int>& A) {
lli n = A.size();
if(n == 0) return 0;
lli ret = 0;
vector <lli>right(n);
vector <lli> left(n);
left[0] = A[0];
for(lli i = 1; i < n; i++){
left[i] += left[i - 1];
left[i] += A[i];
}
right[n - 1] = A[n - 1];
for(lli i = n - 2; i >= 0; i--){
right[i] += right[i + 1];
right[i] += A[i];
}
lli rightMul = 0;
lli cnt = n - 1;
for(lli i = n - 1; i > 0; i--){
rightMul += (A[i] * cnt);
cnt--;
}
vector <lli> x(n);
for(lli i = 0; i < n - 1; i++){
x[i] = rightMul;
rightMul -= right[i + 1];
}
lli leftMul = 0;
cnt = 1;
for(lli i = 0; i < n - 1; i++){
leftMul += A[i] * cnt;
cnt++;
}
cnt--;
for(lli i = n - 1; i >= 1; i--){
x[i] += leftMul;
leftMul -= (A[i - 1] * cnt);
if(i - 2 >= 0) leftMul += left[i - 2];
}
ret = INT_MIN;
for(lli i = 0; i < x.size(); i++) ret = max(ret, x[i]);
return ret;
}
};
main(){
Solution ob;
vector<int> v = {4,3,2,6};
cout <<(ob.maxRotateFunction(v));
} อินพุต
[4,3,2,6]
ผลลัพธ์
26