力扣1674.使数组互补的最少操作次数
-
差分数组
- 设两数分别为a,b,用res[x]表示a+b为x时的修改次数
- 若修改后x = a+b,则修改次数为0
- 若修改后x为[1+min(a,b) , limit + max(a,b)],则修改次数为1
- 若修改后x为[2,2*limit],则修改次数为2
- 因此可以遍历每一对数,先把[2,2*limit]加2,再逐渐缩小范围-1
-
class Solution { public: int minMoves(vector<int>& nums, int limit) { int n = nums.size(); vector<int> dif(limit*2+2,0); for(int i=0;i<n/2;i++) { int a = nums[i],b = nums[n-i-1]; int l = 2,r = 2*limit; dif[l] += 2,dif[r+1] -= 2; l = 1 + min(a,b) , r = limit + max(a,b); dif[l] += -1,dif[r+1] -= -1; l = a+b,r=a+b; dif[l] += -1,dif[r+1] -= -1; } int res=n,sum=0; for(int i=2;i<=2*limit;i++) { sum += dif[i]; res = min(res,sum); } return res; } };