031下一个排列

自解法 20ms
使用一遍法,从右向左依次比较相邻两个数字,看其是否为降序排列[降序排列无更大的排列了]
当出现升序排列时,只需要将此处的数字与其右端比其大一点点的数进行交换,再将【i-1】右端的数进行升序排列
就得到比目前大一点的排列了。如图所示

 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int>& nums) {
 4         if (nums.size() == 0)return;
 5         int flag = 1;//用来标记原排列是否无再大的排列
 6         for (int i = nums.size() - 1; i > 0; --i) {//从右端开始比较
 7             if (nums[i - 1] < nums[i])//此处为升序排列        
 8                 for (int j = nums.size() - 1; j > i - 1; --j) //找到比[i-1]大一点点的数
 9                     if (nums[i - 1] < nums[j]) {
10                         swap(nums[i-1],nums[j]);                        
11                         flag = 0;//存在更大的排列
12                         sort(nums.begin()+i, nums.end()); //再将【i - 1】右端的数进行升序排列
13                         return;
14                     }
15         }
16         if (flag)//无再大的排列了,那么就返回最小排列
17             sort(nums.begin(), nums.end());
18         return;
19     }
20 };

//使用C++的排列函数next_permutation  32ms

1 class Solution {
2 public:
3     void nextPermutation(vector<int>& nums) {
4         if (!(next_permutation(nums.begin(), nums.end())))//如果没有更大的排列了
5             sort(nums.begin(), nums.end());//那就返回升序【最小排列】
6     }
7 };

//博客代码
//与自己的解法一样,只不过代码更简洁,时间一样,内存多了一点点

 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int>& nums) {
 4         int n = nums.size(), i = n - 2, j = n - 1;
 5         while (i >= 0 && nums[i] >= nums[i + 1]) --i;
 6         if (i >= 0) {
 7             while (nums[j] <= nums[i]) --j;
 8             swap(nums[i], nums[j]);
 9         }
10         reverse(nums.begin() + i + 1, nums.end());
11     }
12 };

 

posted @ 2019-03-16 15:11  自由之翼Az  阅读(115)  评论(0编辑  收藏  举报