You are given a 0-indexed array of positive integers nums and a positive integer limit.
In one operation, you can choose any two indices i and j and swap nums[i] and nums[j] if |nums[i] - nums[j]| <= limit.
Return the lexicographically smallest array that can be obtained by performing the operation any number of times.
An array a is lexicographically smaller than an array b if in the first position where a and b differ, array a has an element that is less than the corresponding element in b. For example, the array [2,10,3] is lexicographically smaller than the array [10,2,3] because they differ at index 0 and 2 < 10.
0-인덱스로 구성된 양의 정수 배열 nums
와 양의 정수 limit
가 주어집니다.
하나의 연산에서, 두 인덱스 i
와 j
를 선택하여 다음 조건을 만족하는 경우 nums[i]
와 nums[j]
를 교환할 수 있습니다:
limit
이하인 경우에만 교환이 가능합니다.연산을 원하는 만큼 수행하여 얻을 수 있는 사전순으로 가장 작은 배열을 반환하세요.
배열 a | 배열 b | 비교 결과 |
---|---|---|
[2,10,3] | [10,2,3] | 배열 a 가 b 보다 사전순으로 작음 (인덱스 0에서 2 < 10) |
[5,1,4] | [5,1,5] | 배열 a 가 b 보다 사전순으로 작음 (인덱스 2에서 4 < 5) |
배열 a
가 배열 b
보다 사전순으로 작다는 것은, 배열 a
와 b
가 처음으로 다른 위치에서, a
의 해당 요소가 b
의 해당 요소보다 작을 때를 의미합니다.
nums = [1,5,3,9,8], limit = 2
class Solution:
def lexicographicallySmallestArray(self, nums: List[int], limit: int) -> List[int]:
N = len(nums)
target = [(v, i) for i, v in enumerate(nums)]
target.sort()
groups = [[]]
for num, index in target:
if len(groups[-1]) == 0 or num - groups[-1][-1][0] <= limit:
groups[-1].append([num, index])
else:
groups.append([[num, index]])
for group in groups:
indices = [i for _, i in group]
indices.sort()
for i in range(len(group)):
group[i][1] = indices[i]
ans = [0] * N
for group in groups:
for v, i in group:
ans[i] = v
return ans
groups = [[]]
for num, index in target:
if len(groups[-1]) == 0 or num - groups[-1][-1][0] <= limit:
groups[-1].append([num, index])
else:
groups.append([[num, index]])
for group in groups:
indices = [i for _, i in group]
indices.sort()
for i in range(len(group)):
group[i][1] = indices[i]
ans = [0] * N
for group in groups:
for v, i in group:
ans[i] = v
return ans
class Solution:
def lexicographicallySmallestArray(self, nums: List[int], limit: int) -> List[int]:
group = [deque()]
m = {}
target = [(v, i) for i, v in enumerate(nums)]
target.sort()
group_index = 0
for v, i in target:
if len(group[-1]) == 0 or v - group[-1][-1] <= limit:
group[-1].append(v)
else:
group.append(deque([v]))
group_index += 1
m[i] = group_index
ans = []
for i in range(len(nums)):
ans.append(group[m[i]].popleft())
return ans