Leetcode # 31. Next Permutation
- 2022.07.05
- LeetCode
https://leetcode.com/problems/next-permutation/
Solution
Step. 1
由最尾端找起,找到第一個下降的點 nums[i]
Step.2
如果 nums[i] 存在,則和 nums[j] 交換
$$\mathop{\arg\min}_{j > i}{\{nums[j]\,|\,nums[j]>nums[i]\}}$$
Step.3
將 nums[i + 1:] 給 reverse
Time Complexity: O(n)
Space Complexity: O(1)
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# Step 1
i = len(nums) - 2
while nums[i] >= nums[i + 1] and i > -1:
i -= 1
# Step 2
if i >= 0:
j = -1
while nums[j] <= nums[i]:
j -= 1
nums[i], nums[j] = nums[j], nums[i]
# Step 3
left_len = len(nums) - i - 1
for k in range(left_len // 2):
nums[i + 1 + k], nums[-1 - k] = nums[-1 - k], nums[i + 1 + k]
Last Updated on 2023/08/16 by A1go