Description
You are given a 0-indexed integer array nums. In one operation you can replace any element of the array with any two elements that sum to it.
For example, consider nums = [5,6,7]. In one operation, we can replace nums[1] with 2 and 4 and convert nums to [5,2,4,7].
Return the minimum number of operations to make an array that is sorted in non-decreasing order.
Example 1:
Input: nums = [3,9,3]
Output: 2
Explanation: Here are the steps to sort the array in non-decreasing order:
- From [3,9,3], replace the 9 with 3 and 6 so the array becomes [3,3,6,3]
- From [3,3,6,3], replace the 6 with 3 and 3 so the array becomes [3,3,3,3,3]
There are 2 steps to sort the array in non-decreasing order. Therefore, we return 2.
Example 2:
Input: nums = [1,2,3,4,5]
Output: 0
Explanation: The array is already in non-decreasing order. Therefore, we return 0.
Constraints:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
Solution
Greedy, every time, split the current number to be less or equal to the number at the right, and the remaining number should be as large as possible. In order to make sure the current number is less or equal to the right number, check how many parts we need to split the current number, and divide as equally as possible, so each part is less or equal to the right number, and each part is as large as possible.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Code
class Solution:
def minimumReplacement(self, nums: List[int]) -> int:
res = 0
for i in range(len(nums) - 2, -1, -1):
if nums[i] > nums[i + 1]:
num_of_diviors = (nums[i] // nums[i + 1]) + (1 if nums[i] % nums[i + 1] else 0)
nums[i] //= num_of_diviors
res += num_of_diviors - 1
return res