- 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
- 100 lines of Java from the credited upstream file 3505.java.
- The implementation visibly relies on sequence storage, ordered lookup.
- 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 MyMap {2 public TreeMap<Integer, Integer> map = new TreeMap<>();3 public int size = 0;4 public long sum = 0;5}6 7class Solution {8 public long minOperations(int[] nums, int x, int k) {9 10 11 List<Long> minOps = getMinOps(nums, x);12 Long[][] mem = new Long[nums.length + 1][k + 1];13 return minOperations(nums, x, 0, k, minOps, mem);14 }15 16 private static final long INF = Long.MAX_VALUE / 2;17 18 19 20 private long minOperations(int[] nums, int x, int i, int k, List<Long> minOps, Long[][] mem) {21 if (k == 0)22 return 0;23 if (i == nums.length)24 return INF;25 if (mem[i][k] != null)26 return mem[i][k];27 final long skip = minOperations(nums, x, i + 1, k, minOps, mem);28 final long pick = i + x <= nums.length29 ? minOps.get(i) + minOperations(nums, x, i + x, k - 1, minOps, mem)30 : INF;31 return mem[i][k] = Math.min(skip, pick);32 }33 34 35 36 private List<Long> getMinOps(int[] nums, int x) {37 List<Long> minOps = new ArrayList<>();38 MyMap lower = new MyMap();39 MyMap upper = new MyMap();40 for (int i = 0; i < nums.length; ++i) {41 if (lower.map.isEmpty() || nums[i] <= lower.map.lastKey()) {42 lower.map.merge(nums[i], 1, Integer::sum);43 lower.sum += nums[i];44 ++lower.size;45 } else {46 upper.map.merge(nums[i], 1, Integer::sum);47 upper.sum += nums[i];48 ++upper.size;49 }50 if (i >= x) {51 final int outNum = nums[i - x];52 if (lower.map.containsKey(outNum)) {53 lower.map.merge(outNum, -1, Integer::sum);54 if (lower.map.get(outNum) == 0)55 lower.map.remove(outNum);56 lower.sum -= outNum;57 --lower.size;58 } else {59 upper.map.merge(outNum, -1, Integer::sum);60 if (upper.map.get(outNum) == 0)61 upper.map.remove(outNum);62 upper.sum -= outNum;63 --upper.size;64 }65 }66 67 68 if (lower.size < upper.size) {69 final int val = upper.map.firstKey();70 upper.map.merge(val, -1, Integer::sum);71 if (upper.map.get(val) == 0)72 upper.map.remove(val);73 lower.map.merge(val, 1, Integer::sum);74 upper.sum -= val;75 lower.sum += val;76 --upper.size;77 ++lower.size;78 } else if (lower.size - upper.size > 1) {79 final int val = lower.map.lastKey();80 lower.map.merge(val, -1, Integer::sum);81 if (lower.map.get(val) == 0)82 lower.map.remove(val);83 upper.map.merge(val, 1, Integer::sum);84 lower.sum -= val;85 upper.sum += val;86 --lower.size;87 ++upper.size;88 }89 90 91 if (i >= x - 1) {92 final int median = lower.map.lastKey();93 final long ops = (median * lower.size - lower.sum) + (upper.sum - median * upper.size);94 minOps.add(ops);95 }96 }97 return minOps;98 }99}100