算法一 双层循环
时间复杂度:n^2
空间复杂度:n
int bestRotation(int* nums, int numsSize){
char Differ_L[numsSize];
int Temp;//临时存储首位
int Temp_Score;//临时分数
int Index;//当前最优k
int Score;//当前最优k对应的分数
//Differ_L初始化
Index=0;
Score=0;
for(int i=0;i<numsSize;i++){
nums[i]=i-nums[i];
if(nums[i]>=0) Score++;
}
//迭代开始
for(int i=1;i<numsSize;i++){
Temp_Score=0;
Temp=nums[0];
//前numsSize-1数据计算
for(int j=0;j<numsSize-1;j++){
nums[j]=nums[j+1]-1;
if(nums[j]>=0) Temp_Score++;
}
//第numsSize数据计算
nums[numsSize-1]=Temp+numsSize-1;
if(nums[numsSize-1]>=0) Temp_Score++;
//最优判定
if(Temp_Score>Score){
Index=i;
Score=Temp_Score;
}
return Index;
}
算法二 差分数组
时间复杂度:n
空间复杂度:n
int bestRotation(int* nums, int numsSize){
int ret=0;
//差分数组初始化
int Differ[numsSize];
for(int i=0;i<numsSize;i++){
Differ[i]=0;
}
//差分数组计算
for(int i=0;i<numsSize;i++){
if(i>=nums[i]){
Differ[0]++;
if(i-nums[i]+1<numsSize) Differ[i-nums[i]+1]--;
if(i+1<numsSize) Differ[i+1]++;
}
else{
Differ[i+1]++;
if(numsSize-nums[i]+i+1<numsSize) Differ[numsSize-nums[i]+i+1]--;
}
}
//前缀和
for(int i=1;i<numsSize;i++){
Differ[i]+=Differ[i-1];
if(Differ[i]>Differ[ret]) ret=i;
}
return ret;
}