Leetcode 31 Medium
解题思路:
- 其实就是字典排序算法。
- 1.首先从右到左遍历vector,当i-1>=0时,寻找第一个
nums[i-1]<nums[i]的元素,记录i-1
2.再从右向左遍历vector,找到第一个比nums[i-1]大的位置j,交换nums[i-1]和nums[j]的元素。
3.将从第i个位置的元素到整个vector最后,从大到小进行排序 - 如果vector只有一个元素的话,直接输出就好了
- 时间复杂度:O(n
2
^{2}
2)
- 空间复杂度:O(1)
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i,j;
int tmp;
bool isSearch = false;
if(nums.size() == 1){
cout << nums[0];
return;
}
for(i=nums.size()-1;i>=0 && !isSearch;i--){
if((i-1)>=0 && nums[i] > nums[i-1]){
for(j=nums.size()-1;j>=0;j--){
if(nums[j] > nums[i-1]){
tmp = nums[j];
nums[j] = nums[i-1];
nums[i-1] = tmp;
sort(nums.begin()+i,nums.end());
isSearch = true;
break;
}
}
}
}
if(i < 0){
sort(nums.begin(),nums.end());
}
for(i=0;i<nums.size();i++){
cout << nums[i];
}
}
};