[leetcode_31]Next Permutation

给定一个数组,求该数的序列的下一个序列。如果该序列已经是最后一个最大的序列了,输出最小的排序。
首先思路一定要清晰。

要找第一个值得交换的数——该数尽可能的靠近个位,且该数的前面存在一个数比该数大。然后找到前面那个比该数大的最小的数交换即可。
最后~该数前面的所有数升序排序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int cmp(int a,int b) {
    return a < b;
}
class Solution {
public:
    void nextPermutation(vector<int> &num) {
        bool IsSwap = false;
        for(int i = num.size()-1;i >= 0;i--) {
            int index = -1;
            int max = 0xffff;
            for(int j = i+1;j < num.size();j++) {
                if(num[j] > num[i] && num[j] < max) {
                    index = j;
                    max = num[j];
                    IsSwap = true;
                }
            }
            if(IsSwap) {
                int tmp = num[index];
                num[index] = num[i];
                num[i] = tmp;
                sort(num.begin()+i+1,num.end(),cmp);
                break;
            }
        }
        if(IsSwap == false) {
            sort(num.begin(),num.end(),cmp);
        }
    }
};
Licensed under CC BY-NC-SA 4.0