因为懒得改格式了所以直接截图原题了
解题思路
这道题要求求最小值,要考虑贪心思路。由于要构建的的是回文数组,并且只能加1,那么我们不妨使用双指针分别从头尾开始,每一次看当前这两个数小的一个数需要加多少才能和大的那个相等,记录至sum数组。最后,再通过查看每一个sum[i]-sum[i-1]的值(因为可以进行区间操作,所以上一个数上升的大小就不用再计了),就能得到最小的操作次数了。
核心代码
双指针处理部分
for(int i=1,j=n;i<=n,j>=1;i++,j--){
if(a[i]>=a[j]){
sum[i]=0;
sum[j]=a[i]-a[j];
}
else{
sum[i]=a[j]-a[i];
sum[j]=0;
}
}
sum数组处理部分
long long ret=0;
for(int i=1;i<=n;i++){
if(sum[i]>=sum[i-1]){
ret+=sum[i]-sum[i-1];
}
}