LeetCode:Next Permutation

題目連接html

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).code

The replacement must be in-place, do not allocate extra memory.htm

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1blog


步驟以下:ip

  • 從最尾端開始往前尋找兩個相鄰的元素,二者知足i < ii(令第一個元素爲i,第二個元素爲ii)
  • 若是沒有找到這樣的一對元素則,代表當前的排列是最大的,沒有下一個大的排列
  • 若是找到,再從末尾開始找出第一個大於i的元素,記爲j                                  本文地址
  • 交換元素i, j,再將ii後面的全部元素顛倒排列(包括ii)
  • 若是某個排列沒有比他大的下一個排列(即該排列是遞減有序的),調用這個函數仍是會把原排列翻轉,即獲得最小的排列
class Solution {
public:
    void nextPermutation(vector<int> &num) {
        int n = num.size();
        if(n == 1)return;
        for(int i = n-2, ii = n-1; i >= 0; i--,ii--)
            if(num[i] < num[ii])
            {
                int j = n-1;
                while(num[j] <= num[i])j--;//從尾部找到第一個比num[i]大的數,必定能夠找到
                swap(num[i], num[j]);
                reverse(num.begin()+ii, num.end());
                return;
            }
        reverse(num.begin(), num.end());
    }
};

 

STL中還提供了一個prev_permutation,能夠參考個人另外一篇博客:hereleetcode

 

【版權聲明】轉載請註明出處:http://www.cnblogs.com/TenosDoIt/p/3770126.htmlget

相關文章
相關標籤/搜索