LeetCode-031-下一個排列

題目描述:實(shí)現(xiàn)獲取 下一個排列 的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數(shù)字重新排列成最小的排列(即升序排列)。
必須 原地 修改,只允許使用額外常數(shù)空間。
示例說明請見LeetCode官網(wǎng)。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/next-permutation/ ??
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
解法一:遍歷數(shù)組
首先,如果數(shù)組為空或者數(shù)組只有一個元素,直接返回;
聲明一個變量handled表示是否找到更大的排列,默認(rèn)是false,left和right分別記錄找到更大排列需要調(diào)換的數(shù)字,然后雙重循環(huán)遍歷數(shù)組判斷是否存在更大的排列,具體遍歷過程如下:
從數(shù)組的最后一位開始遍歷,如果存在前面的數(shù)字比當(dāng)前數(shù)字大的,則left和right分別記錄當(dāng)前索引位,并將handled更新為true,然后遍歷下一位;
遍歷過程中需要判斷如果找到一種符合條件的數(shù)字,要判斷是否比之前已得到的情況更優(yōu),如果是,更新left和right。
然后根據(jù)handled判斷,如果為false,說明沒有更大的排列,也就是不存在下一個更大排列,將數(shù)字重新排列成最小的排列,就是將順序倒排;如果為true,則需要進(jìn)行如下處理:
首先,將left和right位置的數(shù)字調(diào)換位置;
然后將 right+1 后面的數(shù)字倒排,這一步是為了將后面的數(shù)字排列成最小的值;
然后將 left+1到right-1 之間的數(shù)字跟 right+1到nums.length-1 的數(shù)字整體調(diào)換順序,這一步也是為了將left后面的數(shù)字排列成最小的值;
然后將 left+1 位置的數(shù)字移到小于它的數(shù)字之后,這一步是為了獲取最終的排列結(jié)果。
【每日寄語】 努力是人生應(yīng)有的態(tài)度,睜開眼就是新的開始。