题目:
解答:
主要是了解这里的,下一个序列的含义:使数列的大小排序递增1
方法:
- 从右至左寻找出第一个相邻数为递增关系的
- 将相邻数左数与右边的第一个大于它的数替换
- reverse右边的数列
这里有个有意思的地方,使用for(exp){if(exp)…}`的计算速度远低于使用while(exp & exp)的方式
代码:
class Solution {
public:
//方法一,使用for,耗时20ms
void nextPermutation(vector<int>& nums) {
int len = nums.size();//3,5,4,2,1
if(len < 2) return;
for(int i = len - 1;i > 0;--i){
if(nums[i] > nums[i-1]){
for(int j = len - 1;j >= i;--j){
if(nums[j] > nums[i-1]){
swap(nums[j], nums[i-1]);
break;
}
}
for(int j = i;j < (len + i) / 2; ++j){
swap(nums[j], nums[len+i-j-1]);
}
return;
}
}
for(int i = 0;i < len / 2; ++i)
swap(nums[i], nums[len-1-i]);
return;
}
//方法二,使用while,耗时8ms
void nextPermutation(vector<int>& nums) {
int len = nums.size();//3,5,4,2,1
if(len < 2) return;
int i = len - 1;
while(i > 0 && nums[i] <= nums[i-1]) --i;
if(i > 0){
for(int j = len - 1;j >= i;--j){
if(nums[j] > nums[i-1]){
swap(nums[j], nums[i-1]);
break;
}
}
for(int j = i;j < (len + i) / 2; ++j){
swap(nums[j], nums[len+i-j-1]);
}
return;
}
for(int i = 0;i < len / 2; ++i)
swap(nums[i], nums[len-1-i]);
return;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)