1. 程式人生 > 其它 >[LeetCode31. 下一個排列——雙指標

[LeetCode31. 下一個排列——雙指標

技術標籤:leetcode列表演算法leetcodepython

LeetCode31. 下一個排列

Difficulty: 中等

實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

示例 1:

輸入:nums = [1,2,3]
輸出:[1,3,2]

示例 2:

輸入:nums = [3,2,1]
輸出:[1,2,3]

示例 3:

輸入:nums = [1,1,5]
輸出:[1,5,1]

示例 4:

輸入:nums = [1]
輸出:[
1]

Solution

分三個步驟
在這裡插入圖片描述

  1. 從後往前找到第一個不是降序的下標
  2. 倒著找到第一個比它大的,交換
  3. 反轉後邊列表(因為後邊就是降序,反過來就完了。如果遇到整個列表降序的情況,全部倒過來就完了)
class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
p=-1 q=-1 #步驟1:從後往前找到第一個不是降序的下標 for i in range(len(nums)-2,-1,-1): if nums[i]<nums[i+1]: p=i break #步驟2:倒著找到第一個比它大的,交換 if p!=-1: for i in range(p,len(nums)): if nums[p]<nums[
i]: q=i nums[p],nums[q]=nums[q],nums[p] #原來使用 nums=nums[:p+1]+sorted(nums[p+1:]) 錯了,原因:必須原地修改! l=p+1 r=len(nums)-1 while l<r:#步驟三:反轉後邊列表(因為後邊就是降序,反過來就完了 nums[l],nums[r]=nums[r],nums[l] l+=1 r-=1 else:#步驟三(整個列表降序的情況)全部倒過來就完了 l=0 r=len(nums)-1 while l<r: nums[l],nums[r]=nums[r],nums[l] l+=1 r-=1