Leetcode31. 下一個排列-python

難度:中等

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

思路:最簡單的一種思路是把數字的排列組合全求出來,然後排序就可以找到了,但是這個非常麻煩,估計數組數目一多,時間複雜度就超時;這裏採取另一種方法,首先這個是有規律的通過上述案例,我們可以發現,只需要從低位開始找高位中比自己小的數值,然後交換即可,但是提交時發現:[1,3,2]變成的是,[2,3,1]但是答案是[2,1,3],我們可以遵循以下規則:

  1. 從數組右側向左開始遍歷,找是否存在nums[i]>nums[i-1]的情況,
  2. 如果不存在這種nums[i]>nums[i-1]情況 ,for循環會遍歷到i==0(也就是沒有下一個排列),此時按題意排成有序Arrays.sort()
  3. 如果存在,則將從下標i到nums.length()的部分排序,然後在排過序的這部分中遍歷找到第一個大於nums[i-1]的數,並與nums[i-1]交換位置

即可以完成本想操作(思路來源於Leetcode大佬的,擊敗90%+)

代碼如下:

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        for i in range(len(nums)-1, 0, -1):
            if nums[i] > nums[i-1]:
                x = nums[i:]
                x.sort()
                nums[i:] = x
                for j in range(i, len(nums)):
                    if nums[j] > nums[i-1]:
                        x=nums[j]
                        nums[j] = nums[i-1]
                        nums[i-1]=x
                        return nums  
        nums.sort()
        return nums

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章