python next permutation_[LeetCode]题解(python):031-Next Permutation

本文介绍如何使用Python解决LeetCode的下一个排列问题,通过逆序遍历找出第一个大于前一个数的位置,然后进行交换并调整后续元素保持有序。代码示例详细展示了如何在原地操作数组,实现递增序列的转换。
摘要由CSDN通过智能技术生成

题目来源

https://leetcode.com/problems/next-permutation/

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

题意分析

Input:一个数组

Output:一个数组(原地操作)

Conditions:输出数组是输入数组的下一个比输入大的数组。 如[1, 2, 3] => [1, 3, 2]

如果输入的是最大的,那么输出最小的数组。    如[3, 2, 1]  => [1, 2, 3]

题目思路

从后往前找第一个比前面大的数字,若是不存在,则已经是最大的数组,直接原地升序排序(list.sort())返回

若是找到最大的值,记录其位置index,然后在index之后(包括index)找一个比nums[index - 1]大的最小值,并将其与nums[index - 1]交换

对index之后(包括index)的nums数组元素进行冒泡排序

AC代码(Python)

1 _author_ = "YE"

2 #-*- coding:utf-8 -*-

3 classSolution(object):4 defnextPermutation(self, nums):5 """

6 :type nums: List[int]7 :rtype: void Do not return anything, modify nums in-place instead.8 """

9 #print(nums)

10 len1 =len(nums)11 index = -1

12 for i in range(len1 - 1):13 if nums[len1 - 1 - i] > nums[len1 - i - 2]:14 index = len1 - 1 -i15 break

16 if index == -1:17 nums.sort()18 else:19 minindex =index20 minvalue =nums[index]21 for i in range(len1 - index - 1):22 if minvalue > nums[index + i + 1] > nums[index - 1]:23 minindex = index + i + 1

24 minvalue =nums[minindex]25

26 nums[minindex] = nums[index - 1]27 nums[index - 1] =minvalue28

29 #sort other numbers from index

30 numbers = len1 -index31 #print(numbers)

32 for i in range(numbers - 1):33 print('I:',i)34 for j in range(numbers - i - 1):35 if nums[len1 - j - 1] < nums[len1 - j - 2]:36 temp = nums[len1 - j - 1]37 nums[len1 - j - 1] = nums[len1 - j - 2]38 nums[len1 - j - 2] =temp39

40 #print(minindex, minvalue)

41 #print(nums)

View Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值