class Solution {
public:
    void nextPermutation(vector<int>&nums) {
        int len = nums.size();
        int k = -1, l = 0, i = 0;//注意三个变量的初始化值
 
        for (i = len - 2/*即倒数第二个元素(逆序遍历)*/;i >= 0;--i)
            if (nums[i + 1] > nums[i]) {
                k = i;
                break;//因为是逆序,故此时得到的k一定是最大的
            }
 
        if (k == -1) {
            reverse(nums.begin(), nums.end());//此时代表原数组为逆序排列,故直接反转
            return;
        }
 
        //接下来找i
        for (i = len - 1;i >= 0;--i) {
            if (nums[i] > nums[k]) {
                l = i;
                break;
            }
        }
 
        //二者交换
        swap(nums[k], nums[l]);
 
        //再反转k之后的元素(不包括nums[k])
        reverse(nums.begin() + k + 1, nums.end());
    }
};

补充一个非常复杂,不美观的版本,使用python实现,也可以AC,能写出来我也挺佩服自己的。

这个版本的主要思想就是从后向前找,记录已查找范围的最大值,当查找到一个值a比已查找区域的最大值maxnum要小的时候,就可以进行换位操作了。

但是要确定一个在已查找区域中比a值大的最小的那个值来进行交换。所以这段代码写的不太美观,如果有高级一点的api可能更美观一些吧。

 1 class Solution:    
 2     def nextPermutation(self, nums: 'List[int]') -> 'None':
 3         for i in range(len(nums)-1,-1,-1):
 4             basenum = nums[i]
 5             maxnum = basenum
 6             for j in range(i-1,-1,-1):
 7                 curnum = nums[j]
 8                 maxnum = max(maxnum,curnum)
 9                 if curnum < maxnum:
10                     for x in sorted(nums[j:]):
11                         if x > curnum:
12                             z = j - 1
13                             for y in nums[j:]:
14                                 z += 1
15                                 if x == y:
16                                     slices1 = nums[j:z]
17                                     slices2 = nums[z+1:]
18                                     slices1.extend(slices2)
19                                     nums[j] = nums[z]
20                                     nums[j+1:]=sorted(slices1)
21                                     return
22 
23                     
24         nums.sort()

 

posted on 2018-10-23 15:49  Sempron2800+  阅读(219)  评论(0编辑  收藏  举报