Leetcode热题100-31 下一个排列
- 1. 题目描述
- 2. 代码实现
- 双指针+模拟解法
1. 题目描述
31 下一个排列
2. 代码实现
双指针+模拟解法
class Solution {
public:
// 要求变化幅度最小的数, 那么交换要尽可能地靠右
void nextPermutation(vector<int>& nums) {
int n = nums.size();
for (int i = n - 2; i >= 0; i--) {
// 从后向前查找第一个相邻升序的元素对(i,i+1)
if (nums[i] < nums[i + 1]) {
// 在[i+1,end)从后向前查找第一个满足A[i]<A[j]的j
for (int j = n - 1; j > i; j--) {
if (nums[i] < nums[j]) {
// 找到待交换的两个元素
swap(nums[i], nums[j]);
// 此时从i+1到end必定为降序,将其改为升序排列
sort(nums.begin() + i + 1, nums.end());
return;
}
}
}
}
sort(nums.begin(), nums.end());
}
};