力扣3229.使数组等于目标数组所需的最少操作次数
-
差分数组
- s表示累积量
- k表示差值
- 如果累积量足够,则不需要额外操作
-
class Solution { public: long long minimumOperations(vector<int>& nums, vector<int>& target) { long long s = target[0] - nums[0]; long long ans = abs(s); for(int i=1;i<nums.size();i++) { int k = (target[i] - target[i-1]) - (nums[i] - nums[i-1]); if(k>0) ans += s >= 0 ? k : max(k+s,0LL); else ans -= s <= 0 ? k : min(k+s,0LL); s += k; } return ans; } };
优化
-
通过差分数组的性质
- 发现实际上只要将所有正项求和即为次数
-
class Solution { public: long long minimumOperations(vector<int>& nums, vector<int>& target) { int n = nums.size(); long long ans = max(target[0] - nums[0],0); for(int i=1;i<n;i++) ans += max((target[i] - nums[i]) - (target[i-1] - nums[i-1]) , 0); ans += max(-(target[n - 1] - nums[n - 1]), 0); return ans; } };