原題連結
前情提要,結合原題解區的題解
題解
先簡化問題,對於一對數 \(a,b\),其中 \(a\leq b\),要使其差為 \(X\) 的運算元是多少?
分類討論
1.如果 \(b-a==X\),運算元為 \(0\)(不操作)
2.如果 \(X\lt b-a\),運算元為 \(1\)(增加a或者減小b)
3.如果 \(X \in [b-a+1,k-a]\),運算元為 \(1\)(增大b)
4.如果 \(X\in [b-a+1,b]\),運算元為 \(1\)(減小a)
5.否則運算元為 \(2\)(增加b,同時減小a)
實現
對於 \(X\in[0,b-a)\cup [b-a+1,\max(k-a,b)]\) 的區間運算元為 1
對於 \(X\in[b-a,b-a]\) 的區間,運算元為 \(0\)
對於 \(X\in(\max(k-a,b),k]\) 的區間,運算元為 \(2\)
相當於區間修改,單點查詢(一次),因此可以用差分陣列解決
code
class Solution {
public:
int minChanges(vector<int>& nums, int k) {
int n=nums.size();
vector<int> d(k+3,0);
for(int i=0;2*i<n;i++)
{
int a=min(nums[i],nums[n-i-1]);
int b=max(nums[i],nums[n-i-1]);
int m1=b-a;
int m2=max(k-a,b);
d[0]++;
d[m1]--;
d[m1+1]++;
d[m2+1]--;
d[m2+1]+=2;
d[k+1]-=2;
}
int ans=d[0];
for(int i=1;i<=k;i++)
{
d[i]+=d[i-1];
ans=min(ans,d[i]);
}
return ans;
}
};