4 未知 leetcode 31 下一个排列

题目描述

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须[原地]修改,只允许使用额外常数空间。

例子:

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

官方难度

Medium

解题思路

没有思路,举例子找思路
176523 -->176532,
175632-->176532,
176791921-->176792119,
176543 -->314567,
貌似是从个位数字开始往前找,如果都比当前数字的最大数字大,则继续找,直到找到比当前最大数字小的位置,因为只有10个数字,我们可以用大小为10的数组来存储当前遍历有几位数,找到以后把比它大一点的数字放在该位置,剩余的进行排列,如果找到结尾都找不到就结束。
说不清楚思路,全靠举个例子:

  1. 输入1767919221,初始化一个num[0] = 0, ..., num[9] = 0, max = 0
  2. 先看最后一位1, num[1] += 1, max=1
  3. 看十位2, 因为max<=2, 让max=2, num[2] += 1
    4.继续看百位2, 因为max<=2, 让max=2, num[2] += 1
  4. 继续看千位9 因为max<=9,max=9, num[9] += 1
  5. 继续看万位1, 因为max=9>1, 寻找num中比1大的数字,发现是2.
  6. 修改万位2. num[1] += 1, num[2] -=1,得到前几位176792
  7. 将数组中剩余的数字按照从大到小排序,加在176792后面,为17679211229 ,结束。
  8. 如果到最后一位还没有找到,则直接排序。

然而测试用例有超过10的数字,所以这样不OK,新的解决思路如下:
上面的解决方案大体是对的,可以改一下


图片.png

代码如下:

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        if len(nums) <= 1:
            return nums
        i = len(nums) - 2
        while (i >= 0) and (nums[i+1] <= nums[i]):
           i -= 1
        if (i>=0):
            j = len(nums) -1
            while(nums[i] >= nums[j]):
                j -= 1
            temp = nums[i]
            nums[i] = nums[j]
            nums[j] = temp
        def reverse(nums, start):
            end = len(nums) - 1
            while(start < end):
                temp = nums[start]
                nums[start] = nums[end]
                nums[end] = temp 
                start += 1
                end -= 1
            return nums
        
        return reverse(nums, i+1)
        
# @lc code=end


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,698评论 0 2
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 10,216评论 0 11
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 8,627评论 0 19
  • 8月22日-----字符串相关 2-3 个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消...
    future_d180阅读 4,535评论 0 1
  • 目录 1. 栈和队列1.用两个队列实现栈2.用两个栈实现队列3.实现一个栈,可以用常数级时间找出栈中的最小值4.判...
    MigrationUK阅读 8,136评论 4 20