LeetCode 31 - 下一个排序 - 解题思路记录 - Golang

755 阅读4分钟

Hello, 大家好, 回来更新了, 今天一天都在刷题, 也遇到很多题目都不会的,但是依旧去钻研
然后呢, 想分享一些比较有意义跟能锻炼到思考能力的题目给大家, 以后我就尽可能的不给一些太简单的题目了.让大家也可以有思考的机会不会一看就懂的那种

那么今天呢我打算来讲解一下LeetCode的第31题-下一个排列,这道题目我觉得考察的点还是蛮不错的, 适合拿出来做一下例题讲解,锻炼下大家思维能力

题目

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 and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题目跟例子, 简单讲解一下就是要找出一个最接近给出数值的下一个最大的值,很抽象吧
按照例子来说, 如果给定123 就要返回一个比它大一点的值 那就是132,如果给定的值已经是最大的了, 那么就要返回这个数字的反序列,比如321就返回123
并且只能在原有的数组上操作

那这一道题目最主要的考核点我整理了一下

考核重点

有一下3点重点

  • 下标指针的用法
  • 数组交换的用法
  • 升序/降序的用法

然后再来解释一下这道题目难理解的地方

题目难点

  • 比较计数单位
  • 替换技术单位
  • 对i+1后的数字做升序

我们需要进行两次的寻找
第一次寻找的是需要更换的计数单位的下标
第二次寻找的是替换数值的下标

解题思路

我们来举个例子, 对于数值13481 我们要寻找它的下一个最大且最近接的值
我们先从十位看起, 也就是 81已经是十位数里面最大的了,这个已经无法更换了
我们就往百位看481 比它更大且只能用本身的数字那就是841
48十位和百位互换位置, 但我们发现,它其实不是最小的, 还有一个位置可以更小,那就是14再做一次升序把数字变成814很明显比841要小

因此一次的转换后,从13481的下一个数就是13814,在这个过程里,就涉及了3个过程

  • 第一个过程 寻找替换计数单位的下标也就是这里的4
  • 第二个过程 寻找需要替换的值 也就是这里把 4 替换成 8
  • 第三个过程 升序操作 也就是把41排序成14

就此制止了这一次操作, 那么我们来看一下代码吧.


func nextPermutation(nums []int)  {
 n := len(nums)
 i:= n -2
 for i >= 0 && nums[i]>=nums[i+1] { //寻找一个最小可以交换位置的地方
  i--
 }
 if i>=0{
  j := n-1
  for j>i&&nums[j]<=nums[i]{ //寻找一个最小的值交换
   j--
  }
  swap(&nums, i, j)
 }
 sorted(&nums, i+1, n)
 fmt.Println(nums)
}
func sorted(nums *[]int, start, end int){
 temp := (*nums)[start:end]
 sort.Ints(temp)
 (*nums) = append((*nums)[:start], temp...)
}
func swap(nums *[]int, a, b int){
 temp := (*nums)[a]
 (*nums)[a] = (*nums)[b]
 (*nums)[b] = temp
}

大家其实可以看到, 主要涉及的代码不多, 最主要的就是2个循环语句大家需要去认真了解一下

第一个for主要在说寻找计数单数,寻找到一个 i<i+1的值, 也就是刚才例子中的4这个位置的下标
第二个for主要在找替换哪个数值, i和j在比较, 取一个最小的值替换在下标4的位置 因为数值越小,越接近
第三步 交换i和j -> 4和8
最后一个排序算法 把i+1 -> n的值排序依次就行。 那这道题就讲解到这里, 今天不画图了,因为在用Mac写文案, 明天看有机会的话再讲解一道稍微难懂的题目给大家

主要思路编写在掘金里

LeetCode 18 - 4数之和 - 解题思路记录 - Golang

LeetCode 55 - 跳跃游戏 - 解题思路记录(动态规划优化版) - GoLang

LeetCode 55 - 跳跃游戏 - 解题思路记录(递归+动态规划法) - Golang

LeetCode 53 - 最大子序和 - 解题思路记录(附带动态规划) - GoLang

LeetCode 49 - 字母异位词分组 - 解题思路记录 - Golang

LeetCode 21 - 合并有序链表 - 解题思路记录 - GoLang

LeetCode 2 - 两数之和 - 解题思路记录 - GoLang

LeetCode 12 - 罗马数字 - 解题思路记录 - GoLang

LeetCode 15 - 3数之和 - 解题思路记录 - GoLang

LeetCode 5 - 回文串 - 解题思路记录 - GoLang

Github代码-持续更新