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」
「4」和「8」十位和百位互换位置, 但我们发现,它其实不是最小的, 还有一个位置可以更小,那就是「1」跟「4」再做一次升序把数字变成「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写文案, 明天看有机会的话再讲解一道稍微难懂的题目给大家