该题的思路是从后向前扫描数组,找到第一对位置 i,j (i < j) 使得 i 位置的值小于 j 位置的值,交换 i 位置和 j 位置的元素值,然后对 i 位置之后的元素进行排序即可。代码如下:
vector<int> nextPermutation(vector<int> &nums) { // write your code here int size = nums.size(); //标记数组是否为递减数组 bool flag = false; //找出从后向前第一个不递增的元素 int i = size - 1; for(; i > 0; i--){ if(nums[i - 1] < nums[i]){ flag = true; break; } } //若数组为递减数组,则下一个全排列直接反转数组即可 if(flag == false){ sort(nums.begin(), nums.end()); return nums; } //找到第一个比反转元素大的元素 int k = size - 1; while(nums[k] <= nums[i - 1]) k--; //交换元素 int tmp = nums[i - 1]; nums[i - 1] = nums[k]; nums[k] = tmp; //排序剩余元素 sort(nums.begin() + i, nums.end()); return nums; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-21 12:23:42