题目描述
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解题思路
由于各个排列按照字典序排序,所以以 1,3,2
→ 2,1,3为例,
寻找下一个排列的步骤是:
- 首先找到从后往前第一个升序数对,在此例中即(1,3)
- 然后在升序对前一个数后面的数组中,从后往前找到第一个比升序对前一个数大的数,并将其与升序对前一个数交换,在此例中即找到2比1大,所以将2与1交换得到2,3,1
- 最后将交换后的数组从升序对后一个数开始按升序排序,在此例中即从3开始按升序排序得到2,1,3
在第一步中,若遍历到数组头部仍未找到升序对,说明不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
代码
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 for(int i = nums.size() - 1; i >= 0; i--){ 5 if(i == 0) 6 sort(nums.begin(), nums.end()); 7 else if(nums[i] > nums[i - 1]){ 8 int minIdx = nums.size() - 1; 9 while(nums[i - 1] >= nums[minIdx]) 10 minIdx--; 11 swap(nums[minIdx], nums[i - 1]); 12 sort(nums.begin() + i, nums.end()); 13 break; 14 } 15 } 16 } 17 };
原文地址:https://www.cnblogs.com/wmx24/p/9190853.html
时间: 2024-11-05 22:52:51