class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
sortedNums = sorted(nums)
res = []
def backtrack(curr, counter):
if len(curr) == len(sortedNums):
res.append(list(curr))
return
else:
for num in counter:
if counter[num] > 0:
counter[num] -= 1
curr.append(num)
backtrack(curr, counter)
counter[num] += 1
curr.pop()
backtrack([], Counter(sortedNums))
i = 0
while i < len(res):
if ''.join(map(str, res[i])) == ''.join(map(str, nums)):
break
i += 1
if i == len(res) - 1:
nums[::] = res[0]
else:
nums[::] = res[i+1]
但是我的做法時間複雜度非常高,會超時。
解法
上面的解法屬於暴力解法,沒有考慮到下一個字典數的特色,不過這個規則其實也不是很好想到。
我暫時還想不太到要怎麼寫這一題的筆記。
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i = len(nums) - 2
while i >= 0 and nums[i] >= nums[i+1]:
i -= 1
if i >= 0:
j = len(nums) - 1
while nums[j] <= nums[i]:
j -= 1
nums[i], nums[j] = nums[j], nums[i]
i += 1
k = len(nums) - 1
while i < k:
nums[i], nums[k] = nums[k], nums[i]
i += 1
k -= 1