实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:
输入:nums = [1]
输出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
思路:
从后往前看数字,有两种情况;
对于第二种情况,处理如下:
题解 cpp
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int k = nums.size() - 1;
while (k > 0 && nums[k - 1] >= nums[k]) k -- ;
if (k <= 0) {
reverse(nums.begin(), nums.end());
} else {
int t = k;
while (t < nums.size() && nums[t] > nums[k - 1]) t ++ ;
swap(nums[t - 1], nums[k - 1]);
reverse(nums.begin() + k, nums.end());
}
}
};
题解草稿:
从末尾开始;
定位到第一个“前比后小”中的“后”的那个位置;
(比如,用k表示要定位到的位置,那么k要满足的条件就是nums[k - 1] < nums[k]
;
那么从末尾开始,只要不满足这个条件就一直 k --
)
即为:while(k > 0 && nums[k - 1] >= num[k]) k --;
不满足条件就跳出循环;
1.不满足条件1 :情况1,直接逆序;
2.不满足条件2:情况2;