![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9625d9567f781eecd4b10b348b0e04c5.png)
暴力求解:
先进行数组的旋转,在进行求和。在所有旋转中找到求和最大的值进行返回,但这样会超时。
class Solution {
private:
void SwapArr(vector<int>&nums,int i){
//根据i来旋转
vector<int>tmp(nums.begin(),nums.begin()+nums.size()-i);//获取前半段数组
nums.erase(nums.begin(),nums.begin()+nums.size()-i);
for(int i=0;i<tmp.size();i++){
nums.push_back(tmp[i]);
}
}
int GetNums(const vector<int>&nums){
//获取nums的值
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=i*nums[i];
}
return sum;
}
public:
int maxRotateFunction(vector<int>& nums) {
if(nums.size()==1||nums.size()==0){
return 0;
}
int ret=INT_MIN;
for(int i=0;i<nums.size();i++){
vector<int>tmpvet=nums;
SwapArr(tmpvet,i);
ret=max(ret,GetNums(tmpvet));
}
return ret;
}
};
根据每次求和的数学关系式,找到数学表达式
class Solution {
int GetSumArr(vector<int>&nums,int&F0){
int SumArr=0;
for(int i=0;i<nums.size();i++){
SumArr+=nums[i];
F0+=i*nums[i];
}
return SumArr;
}
public:
int maxRotateFunction(vector<int>& nums) {
if(nums.size()==0||nums.size()==1){
return 0;
}
int F0=0;
int SumArr=GetSumArr(nums,F0);
int PrevFi=F0;
int Max=F0;
for(int i=1;i<nums.size();i++){
int Fi=PrevFi+SumArr-nums.size()*nums[nums.size()-i];
PrevFi=Fi;
Max=max(Max,Fi);
}
return Max;
}
};