Leecode31 next-permutation

題目描述

實現(xiàn)函數(shù)next permutation(下一個排列):將排列中的數(shù)字重新排列成字典序中的下一個更大的排列。將排列中的數(shù)字重新排列成字典序中的下一個更大的排列。
如果不存在這樣的排列,則將其排列為字典序最小的排列(升序排列)
需要使用原地算法來解決這個問題,不能申請額外的內(nèi)存空間
下面有機組樣例,左邊是輸入的數(shù)據(jù),右邊是輸出的答案
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1

分析

  • 先從末尾向前找出 第一個非升序(這個升序是不嚴格升序)的下標,如 1 2 6642
    先找出來標出的2,由于2 后面的數(shù)字全是降序,這是后面四位數(shù)所能組成的最大數(shù)。
  • 如果想讓整體變大,而且是變大成相鄰的數(shù)字,可以考慮將 2變大一些,因為后面四位數(shù)是他們所能組成的最大數(shù)了,要想變大,用6642里面比2稍微大一些的數(shù)替換2,就可以使整體變大一些。
  • 剩下的四位數(shù)要盡可能小,于是將他們升序排列
  • 特殊情況,可能所給的數(shù)字是降序的 54321,則直接將其排序。

java 代碼

import java.util.*;
public class Solution {
    public void nextPermutation(int[] num) {
        if(num == null || num.length == 0){return ;}
        
        int last = num.length - 2;
        while(last >=0 && num[last] >= num[last + 1]){
            last--;
        }
        if(last < 0){
            Arrays.sort(num);
            return;
        }
        int i = last + 1;
        while(i < num.length && num[i] > num[last]){
            i++;
        }
        int temp = num[last];
        num[last] = num[i-1];
        num[i-1] = temp;
        //swap(last,i-1);
        //sort(last+1,num.length -1);
        Arrays.sort(num,last + 1,num.length);
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 全排列 帶重復元素的排列 下一個排列 上一個排列 第 k 個排列 排列序號 排列序號II 全排列 給定一個數(shù)字列表...
    六尺帳篷閱讀 2,478評論 0 14
  • 下一個排列 實現(xiàn)獲取下一個排列的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個更大的排列。如果不存在下一個更...
    Sitch閱讀 225評論 0 0
  • 題目描述(中等難度) 這道題的的難度我覺得理解題意就占了一半。題目的意思是給定一個數(shù),然后將這些數(shù)字的位置重新排列...
    windliang閱讀 141評論 0 0
  • 共同乘皈依法:誠信佛為師,法為道,僧眾為修道助伴,以此方式而皈依。 不共同密乘皈依法:身、口、意三門供養(yǎng)上師,依止...
    美麗蝴蝶閱讀 2,326評論 0 2
  • 夢想是注定孤獨的旅行,路上少不了質(zhì)疑和嘲笑,但那又怎樣,哪怕遍體鱗傷也要活得漂亮;生活會讓你苦上一陣子,等你適應以...
    淺灘一粟閱讀 49評論 0 1

友情鏈接更多精彩內(nèi)容