leetcode刷题记录Array篇(31~Next Permutation)

L千年老妖 · · 1455 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

##31.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.

翻译:实现下一个排列,将数字重新排列成数字的下一个更大排列。如果这种安排是不可能的,它必须将其重新排列为尽可能低的顺序(即以升序排序)。替换必须在原位置,不要分配额外的内存。

思路:这题的题意比较隐晦啊,网上找了别人的例子才明白题目的意思。。。。,知道题目的意思后,解题简单了很多。题意:就是把数组每个元素组合起来成为一个数字,比如[1,3,1,3,1],则为13131,然后用数组中的元素重新排列,得到比13131大一点的数,即13311,答案就是它.

实现过程:
1.倒序遍历数组,如果nums[i-1]<nums[i],则i-1该位置需要调换值,我们设index=i-1 2.然后再次倒序遍历,如果找到nums[i]>nums[index],调换两个数字,并且把index下标后的数字升序排列,得到答案。
3.题目还要求没有比原始值大的下一个排列,则需要把该原始序列升序排列,即3,2,1,没有比他更大的数,则需要返回1,2,3

下面是代码实现:

golang代码:

    package main

  import (
      "fmt"
  )

  func main() {
      nums := []int{1, 2}
      nextPermutation(nums)
      fmt.Println(nums)
  }

  func nextPermutation(nums []int) {

    arrLen := len(nums)
    if arrLen < 2 {
        return
    }
    index := -1
    for i := arrLen - 1; i > 0; i-- {
        if nums[i-1] < nums[i] {
            index = i - 1
            break
        }
    }
    if index == -1 {
        reserve(nums)
        return
    }

    for i := arrLen - 1; i > 0; i-- {
        if nums[i] > nums[index] {
            nums[i], nums[index] = nums[index], nums[i]
            reserve(nums[index+1:])
            break
        }
    }

    return
  }

  func reserve(nums []int) {
      for i, j := 0, len(nums)-1; i < j; i, j = i+1, j-1 {
        nums[i], nums[j] = nums[j], nums[i]
    }
    return
  }

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:L千年老妖

查看原文:leetcode刷题记录Array篇(31~Next Permutation)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1455 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传