31. 下一个排列

自己做
解:排序实现

cpp
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int nums_len = nums.size();
if(nums_len == 1) //只有一个元素不处理,直接返回
return;
int i = nums_len - 2; //前一元素
int j = nums_len - 1; //后一元素
//找到前一元素比后一元素小的元素
while(i >= 0 && nums[i] >= nums[j]){
j = i;
i--; //前移
}
//这里要么发现了前一元素(i = xxx)比后一元素小,要么整个数组都是倒序的(i = -1)
//倒序的情况
if(i == -1) //如果数组是倒序的
return sort(nums.begin(), nums.end()); //升序排序
//找到比i大的最小值(从j往后的位置)
//将i往后的元素重新排为升序
vector<int>::iterator it = nums.begin();
for(int z = 0; z < i + 1; z++) //找到i+1位置的指针
it++;
sort(it,nums.end()); //排序i+1往后的元素(升序)
for(int z = j; z < nums_len; z++)
if(nums[z] > nums[i]){ //找到了
//交换元素
int temp = nums[z];
nums[z] = nums[i];
nums[i] = temp;
break;
}
//交换后重新排序
sort(it,nums.end()); //排序i+1往后的元素(升序)
}
};
