[leetcode ] 31. Next Permutation

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

Next Permutation

分析及題解:這道題是尋找給定的一列數(shù)的下一個(gè)排列, 如果給定的數(shù)是該列數(shù)的最后一個(gè)排列, 則該列數(shù)的下一個(gè)排列是該列數(shù)的第一個(gè)排列. 如6, 5, 4, 3, 2, 1是該列數(shù)的最后一個(gè)排列, 則下一個(gè)排列是1, 2, 3, 4, 5, 6, 也即是該列數(shù)的第一個(gè)排列.

解決這道題的重點(diǎn)是找到排列數(shù)的下一個(gè)排列數(shù)的生成規(guī)律, 對于1, 2, 6, 5, 4, 3的下一個(gè)排列數(shù)為1, 3, 2, 4, 5, 6. 規(guī)律如下:

從后往前尋找第一個(gè)從后往前不是遞增的數(shù), 用index指向它, 此處是2, 即index = 1, 因?yàn)?小于6, 不滿足從后往前遞增. 然后從后往前尋找第一個(gè)大于index指向的數(shù), 用p指向該數(shù), 此處為3, 即p = 5. 交換indexp指向的數(shù), 最后將index后的數(shù)逆序即可. 如果找到的index為0, 則直接逆序整個(gè)數(shù)列即可. 整個(gè)過程中需要三次遍歷, 算法復(fù)雜度是O(3n)即O(n).

過程如下:

1, 2, 6, 5, 4, 3 --> 1, 3, 6, 5, 4, 2 --> 1, 3, 2, 4, 5, 6.

代碼:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.size() < 2) return;
        
        int index = nums.size() - 2;
        while(index > 0 && nums[index] >= nums[index+1]) {
            // 找到第一個(gè)從后往前數(shù)不是遞增序的數(shù)
            index--;
        }
        
        int p = nums.size() - 1;
        while(p > index && nums[p] <= nums[index]) {
            // 從后往前找到第一個(gè)大于index所指的數(shù)
            p--;
        }
        
        int tmp;
        if(p != index) { // nums不是最后一個(gè)排列
            // 交換p和index所指向的數(shù)據(jù)
            tmp = nums[p];
            nums[p] = nums[index];
            nums[index] = tmp;
            index++;
        }
        // 逆序index之后的數(shù)
        p = nums.size() - 1;
        while(index < p) {
            tmp = nums[index];
            nums[index] = nums[p];
            nums[p] = tmp;
            index++;
            p--;
        }
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斟或,一起剝皮案震驚了整個(gè)濱河市谓媒,隨后出現(xiàn)的幾起案子俐末,更是在濱河造成了極大的恐慌艳汽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡唯鸭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門硅确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來目溉,“玉大人,你說我怎么就攤上這事菱农⊥W觯” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵大莫,是天一觀的道長蛉腌。 經(jīng)常有香客問我,道長只厘,這世上最難降的妖魔是什么烙丛? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮羔味,結(jié)果婚禮上河咽,老公的妹妹穿的比我還像新娘。我一直安慰自己赋元,他們只是感情好忘蟹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搁凸,像睡著了一般媚值。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上护糖,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天褥芒,我揣著相機(jī)與錄音,去河邊找鬼嫡良。 笑死锰扶,一個(gè)胖子當(dāng)著我的面吹牛献酗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坷牛,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼罕偎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了京闰?” 一聲冷哼從身側(cè)響起锨亏,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忙干,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪藻,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捐迫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爱葵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片施戴。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萌丈,靈堂內(nèi)的尸體忽然破棺而出赞哗,到底是詐尸還是另有隱情,我是刑警寧澤辆雾,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布肪笋,位于F島的核電站,受9級特大地震影響度迂,放射性物質(zhì)發(fā)生泄漏藤乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一惭墓、第九天 我趴在偏房一處隱蔽的房頂上張望坛梁。 院中可真熱鬧,春花似錦腊凶、人聲如沸划咐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褐缠。三九已至,卻和暖如春风瘦,著一層夾襖步出監(jiān)牢的瞬間送丰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工弛秋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留器躏,地道東北人俐载。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像登失,于是被迫代替她去往敵國和親遏佣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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