3224. 使差值相等的最少陣列改動次數

纯粹的發表於2024-08-09

原題連結

前情提要,結合原題解區的題解

題解

先簡化問題,對於一對數 \(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;
    }
};

相關文章