Minimum Replacements to Sort the Array

hard array math greedy

Problem

In one operation, replace any element with two positive integers that sum to it. Return the minimum number of operations needed to make nums non-decreasing.

Inputnums = [3, 9, 3]
Output2
Split 9 into [3, 3, 3]; total 2 replacements.

def minimum_replacement(nums):
    ops = 0
    limit = nums[-1]
    for i in range(len(nums) - 2, -1, -1):
        if nums[i] > limit:
            parts = (nums[i] + limit - 1) // limit
            ops += parts - 1
            limit = nums[i] // parts
        else:
            limit = nums[i]
    return ops
function minimumReplacement(nums) {
  let ops = 0;
  let limit = nums[nums.length - 1];
  for (let i = nums.length - 2; i >= 0; i--) {
    if (nums[i] > limit) {
      const parts = Math.ceil(nums[i] / limit);
      ops += parts - 1;
      limit = Math.floor(nums[i] / parts);
    } else {
      limit = nums[i];
    }
  }
  return ops;
}
class Solution {
    public long minimumReplacement(int[] nums) {
        long ops = 0;
        int limit = nums[nums.length - 1];
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] > limit) {
                int parts = (nums[i] + limit - 1) / limit;
                ops += parts - 1;
                limit = nums[i] / parts;
            } else {
                limit = nums[i];
            }
        }
        return ops;
    }
}
long long minimumReplacement(vector<int>& nums) {
    long long ops = 0;
    int limit = nums.back();
    for (int i = (int)nums.size() - 2; i >= 0; i--) {
        if (nums[i] > limit) {
            int parts = (nums[i] + limit - 1) / limit;
            ops += parts - 1;
            limit = nums[i] / parts;
        } else {
            limit = nums[i];
        }
    }
    return ops;
}
Time: O(n) Space: O(1)