[
greedy
math
]
Leetcode 0738 Monotone Increasing Digits
Problem statement
https://leetcode.com/problems/monotone-increasing-digits/
Solution
One way to solve it is greedy approach, where we try to built digit by digit in O(k^2) time.
There is smarter solution with O(k) time and space complexity: we need to find the first place, when digit is decreasing, for example in number 1123334429, it will be 11233344. Then for the last group of repeating digits we need to decrease first one by one and put rest of digits as 9, so the answer will be 1123333999. Also we need to check case, when there is not place when digits decrease, then we return original number.
Complexity
Time and space complexity is O(k), where k number of digits in N.
Code
class Solution:
def monotoneIncreasingDigits(self, N):
prefix, k = ["0"], len(str(N))
for digit in str(N):
if digit >= prefix[-1]:
prefix += [digit]
else:
break
if len(prefix) == k + 1: return N
q = prefix.index(prefix[-1])
return int("".join(prefix[1:q]) + str(int(prefix[q])-1) + "9"*(k-q))