【LeetCode笔记】31. 下一个排列(Java、原地算法、偏数学)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】31. 下一个排列(Java、原地算法、偏数学)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 思路 && 代碼
- 二刷
打卡第八天~
題目描述
- 需要花點時間思考的一道題,這篇題解寫得很好。
思路 && 代碼
- 主要分為這三個步驟:
- 從后往前找到滿足 nums[first] < nums[first + 1] 的索引 first
- 從后往前找到滿足 nums[second] > nums[first] 的索引 second
- 交換 nums[first]、nums[second],翻轉 nums[ first + 1 : ]
- 對于步驟1,找不到 first 時翻轉整個數組,也就是當前排列為最大排列的情況。
- 對于步驟2,nums[second] 一定是最接近 nums[first] 的值(可以證明)
- 步驟3進行交換后,有 nums[first + 1 : ] 滿足 nums[i] > nums[i + 1],即當前排列為nums[first + 1 : ] 的最大排列;那么對nums[first : ]進行一個翻轉,即可得到 nums[first : ]的最小排列,也就是最接近初始排列的下一個排列。
- 借用leetcode 題解區 powcai 大佬的例子:
- 對于 nums = [1, 2, 7, 4, 3, 1]
- 找到 nums[first] = nums[1] = 2
- 找到 nums[second] = nums[4] = 3
- 交換 nums = [1, 3, 7, 4, 2, 1](可以看到 7 4 2 1 是剛好降序排列的)
- 翻轉 nums = [1, 3, (1, 2, 4, 7)] (剛好變成 1, 3 開頭的最小排列,是1, 2 排列的最大排列的下一個排列)
- 復雜度 O(n) 、O(1),很有意思的一道題,可以多看看~
二刷
- keywords:兩個下標、交換、翻轉
- firstIndex:第一個與后面的元素交換,能讓排列變大的元素
- 交換:讓排列變大
- 翻轉:在大于初始排列的情況下,讓排列變得最小。
總結
以上是生活随笔為你收集整理的【LeetCode笔记】31. 下一个排列(Java、原地算法、偏数学)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑如何保养_电脑保养只是吹一吹?
- 下一篇: linux3.x内核实时性改进,linu