31. Next Permutation

題目

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, do not allocate 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

分析

題目要求是給出一個數(shù)字排列中按字典序排列的下一個更大的排列悍缠。如果沒有更大的則給出最小的搅裙,比如1,2,3->1,3,2下一個字典序更大的排列是1,3,2掂林,而3,2,1是最大的字典序排列志鞍,修改為最小的1,2,3。
解這道題可以通過觀察家乘,1,4,3,2 -> 2,1,3,4分為三步:

  1. 逆向?qū)ふ业降谝粋€非遞減的數(shù)nums[i] < nums[i+1]
  2. 將這個數(shù)與后面最后一個比它大的數(shù)調(diào)換(僅大于它)蝗羊,不能找最后一個,因?yàn)樽詈笠粋€不一定大于它烤低。
  3. 將這個數(shù)后面重新排序,讓后面的數(shù)最小

這樣看第一步找到1肘交,第二步將1與2調(diào)換得到2,4,3,1,第三步將2后面的4,3,1排序扑馁,得到2,1,4,3
需要注意的是涯呻,如果這個序列全部遞減(最大),則直接重新排序即得到最小序列
這個方法的原始出處在這里

復(fù)雜度分析

最多對數(shù)組進(jìn)行了3次掃描腻要,時間復(fù)雜度為O(n)复罐,空間復(fù)雜度為O(1)

代碼

public void nextPermutation(int[] nums) {
    if(nums == null || nums.length <= 1) return;

    int i = nums.length - 2;
    for(; i >= 0 && nums[i] >= nums[i+1]; --i); //第一步
    if(i >= 0){  //否則全部都是遞減的,不需要調(diào)換了
        int j = i+1;
        for(; j < nums.length && nums[j] > nums[i]; ++j);  //這里是大于雄家,不能加等于
        swap(nums, i, j - 1);  //第二步
    }

    int j = nums.length - 1;  //因?yàn)楹竺婵隙ㄊ悄嫘虻男ё纾灾苯觾牲c(diǎn)調(diào)換即可
    for(i = i + 1; i < j; i++,j--){
        swap(nums, i, j);
    }
}

public void swap(int[] nums, int index1, int index2){
    int i = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = i;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趟济,隨后出現(xiàn)的幾起案子乱投,更是在濱河造成了極大的恐慌,老刑警劉巖顷编,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚炫,死亡現(xiàn)場離奇詭異,居然都是意外死亡媳纬,警方通過查閱死者的電腦和手機(jī)双肤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钮惠,“玉大人茅糜,你說我怎么就攤上這事∷赝欤” “怎么了蔑赘?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我米死,道長锌历,這世上最難降的妖魔是什么贮庞? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任峦筒,我火速辦了婚禮亿虽,結(jié)果婚禮上垢粮,老公的妹妹穿的比我還像新娘。我一直安慰自己邻邮,他們只是感情好遮斥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布峦失。 她就那樣靜靜地躺著,像睡著了一般术吗。 火紅的嫁衣襯著肌膚如雪尉辑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天较屿,我揣著相機(jī)與錄音隧魄,去河邊找鬼。 笑死隘蝎,一個胖子當(dāng)著我的面吹牛购啄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘱么,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼狮含,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曼振?” 一聲冷哼從身側(cè)響起几迄,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冰评,沒想到半個月后映胁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集索,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年屿愚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务荆。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆距,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出函匕,到底是詐尸還是另有隱情娱据,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布盅惜,位于F島的核電站中剩,受9級特大地震影響忌穿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜结啼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一掠剑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郊愧,春花似錦朴译、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焦蘑,卻和暖如春盯拱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背例嘱。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工狡逢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝶防。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓甚侣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親间学。 傳聞我的和親對象是個殘疾皇子殷费,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容