|
| 1 | +from collections import deque |
| 2 | +from typing import List |
| 3 | + |
| 4 | + |
| 5 | +class Solution: |
| 6 | + def lexicographicallySmallestArray(self, nums: List[int], limit: int) -> List[int]: |
| 7 | + sorted_nums = sorted(nums) |
| 8 | + |
| 9 | + # group elements based on the limit |
| 10 | + groups = [deque([sorted_nums[0]])] |
| 11 | + group_map = {sorted_nums[0]: 0} |
| 12 | + for num in sorted_nums[1:]: |
| 13 | + if abs(num - groups[-1][-1]) <= limit: |
| 14 | + groups[-1].append(num) |
| 15 | + else: |
| 16 | + groups.append(deque([num])) |
| 17 | + group_map[num] = len(groups) - 1 |
| 18 | + |
| 19 | + # replace element with the smallest element in its group |
| 20 | + return [groups[group_map[num]].popleft() for num in nums] |
| 21 | + |
| 22 | + |
| 23 | +def main(): |
| 24 | + nums = [1, 5, 3, 9, 8] |
| 25 | + limit = 2 |
| 26 | + assert Solution().lexicographicallySmallestArray(nums, limit) == [1, 3, 5, 8, 9] |
| 27 | + |
| 28 | + nums = [1, 7, 6, 18, 2, 1] |
| 29 | + limit = 3 |
| 30 | + assert Solution().lexicographicallySmallestArray(nums, limit) == [1, 6, 7, 18, 1, 2] |
| 31 | + |
| 32 | + nums = [1, 7, 28, 19, 10] |
| 33 | + limit = 3 |
| 34 | + assert Solution().lexicographicallySmallestArray(nums, limit) == [1, 7, 28, 19, 10] |
| 35 | + |
| 36 | + |
| 37 | +if __name__ == '__main__': |
| 38 | + main() |
0 commit comments