Approach:
Keep track of actual difference -> Zero changes
Also keep track of Maximum achievable difference, that can be formed by changing
element
Now, If we get Max achievable diff for certain pair as 4, then we can acheieve
a diff of 3 2 1 0 All
So
Next step
For finding answer
Take Diff = 18
One Diff(18) to get - Zero_changes to get 18 = Only those extra pairs we need
To change by updating one value in a pair
And remaining goes to 2 Pair
C++
class Solution {
public:
int minChanges(vector<int>& nums, int k) {
int n = nums.size();
unordered_map<int, int> curDiff;
vector<int> one_diff(k+1, 0);
for(int i=0; i<n/2; i++){
int diff = abs(nums[i] - nums[n-i-1]);
curDiff[diff] ++;
int mini = min(nums[i], nums[n-i-1]);
int maxi = max(nums[i], nums[n-i-1]);
int max_diff = max(k-mini, maxi-0);
one_diff[max_diff] ++;
}
// Propogate values
for(int i=k-1; i>=0; i--){
one_diff[i] += one_diff[i+1];
}
//find_ans
int ans = INT_MAX;
for(auto &[diff, count]: curDiff){
int one_extra = one_diff[diff] - count;
int two = n/2 - one_extra - count;
ans = min(ans, one_extra + two*2);
}
return ans;
}
};