- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 85 lines of C++ from the credited upstream file 3505.cpp.
- The implementation visibly relies on sequence storage.
- 1 loop block detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
1class Solution {2 public:3 long long minOperations(vector<int>& nums, int x, int k) {4 5 6 const vector<long> minOps = getMinOps(nums, x);7 vector<vector<long>> mem(nums.size() + 1, vector<long>(k + 1, -1));8 return minOperations(nums, x, 0, k, minOps, mem);9 }10 11 private:12 static constexpr long kInf = LONG_MAX / 2;13 14 15 16 long minOperations(const vector<int>& nums, int x, int i, int k,17 const vector<long>& minOps, vector<vector<long>>& mem) {18 if (k == 0)19 return 0;20 if (i == nums.size())21 return kInf;22 if (mem[i][k] != -1)23 return mem[i][k];24 const long skip = minOperations(nums, x, i + 1, k, minOps, mem);25 const long pick =26 i + x <= nums.size()27 ? minOps[i] + minOperations(nums, x, i + x, k - 1, minOps, mem)28 : kInf;29 return mem[i][k] = min(skip, pick);30 }31 32 33 34 vector<long> getMinOps(const vector<int>& nums, int x) {35 vector<long> minOps;36 multiset<int> lower;37 multiset<int> upper;38 long lowerSum = 0;39 long upperSum = 0;40 for (int i = 0; i < nums.size(); ++i) {41 if (lower.empty() || nums[i] <= *lower.rbegin()) {42 lower.insert(nums[i]);43 lowerSum += nums[i];44 } else {45 upper.insert(nums[i]);46 upperSum += nums[i];47 }48 if (i >= x) {49 const int outNum = nums[i - x];50 if (const auto it = lower.find(outNum); it != lower.cend()) {51 lower.erase(it);52 lowerSum -= outNum;53 } else {54 upper.erase(upper.find(outNum));55 upperSum -= outNum;56 }57 }58 59 60 if (lower.size() < upper.size()) {61 const int val = *upper.begin();62 upper.erase(upper.begin());63 lower.insert(val);64 upperSum -= val;65 lowerSum += val;66 } else if (lower.size() - upper.size() > 1) {67 const int val = *lower.rbegin();68 lower.erase(prev(lower.end()));69 upper.insert(val);70 lowerSum -= val;71 upperSum += val;72 }73 74 75 if (i >= x - 1) {76 const int median = *lower.rbegin();77 const long ops = (median * lower.size() - lowerSum) +78 (upperSum - median * upper.size());79 minOps.push_back(ops);80 }81 }82 return minOps;83 }84};85