LeetCode 31.下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

分析:

  给出一个数组, 找出下一个排列, 下一个排列由相同的数字组成, 且比当前顺序组成的数字大, 且最接近的

思路:

  从末端开始找第一个降序的数,其位置记为i-1

  从i到数组末端, 找到比i-1的值大, 且值和i-1的值相差最小的数的位置, 记为index

       把i-1和index位置上的值交换

  对i-1之后的值进行排序

 1 void nextPermutation(vector<int>& nums) {
 2         int i, len = nums.size();
 3         int min = 99999999, index = len-1;
 4         //找到第一个降序的位置
 5         for(i = len - 1; i > 0; i--) if(nums[i] > nums[i-1]) break;
 6         //如果i=0 则表示该数组是一个降序的数组
 7         if(i > 0) {
 8         for(int j = i; j < len; j++) {
 9             if(nums[j] > nums[i-1] && nums[j] - nums[i-1] < min) {
10                 index = j;
11                 min = nums[j] - nums[i-1];
12             }
13         }
14         swap(nums[index], nums[i-1]);
15         }
16         sort(nums.begin()+i, nums.end());
17         for(i = 0; i < len; i++) {
18             if(i == 0) cout<<nums[i];
19             else cout<<","<<nums[i];
20         }
21     }

写代码的时候,还是有些不严谨,继续努力

有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
原文地址:https://www.cnblogs.com/mr-stn/p/8877664.html