31. Next Permutation
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size()<2)
return;
for(int i=nums.size()-2;i>=0;i--){
if(nums[i]<nums[i+1]){
for(int j=nums.size()-1;j>i;j--){ //找出大于num是[i]的数字中,最小的那个
if(nums[i]<nums[j]){
swap(nums[i],nums[j]);
sort(nums.begin()+i+1,nums.end());
return;
}
}
}
}
sort(nums.begin(),nums.end());
}
};
数学中的排列组合,比如“1,2,3”的全排列,依次是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
所以题目的意思是,从上面的某一行重排到期下一行,如果已经是最后一行了,则重排成第一行。
6 5 4 8 7 5 1
这个题刚开始看我是懵的,因为以前没接触过全排序,不知道它要干嘛,了解了全排序之后,其实就是交换数据,比如说需要交换第i和第j个元素(假设i<j),则交换完之后,第i+1及其之后的元素要进行重排序,使其递增;那么现在的问题就是找到要交换的元素,我所做就是从后往前查找:
(1)比如现在要查倒数第k个元素,则从倒数第一个元素到倒数第k+1个元素进行顺序查找,若找到其中有一个元素的值大于倒数第k个元素的值,则进行交换,并在交换后按照上述方法排序。
(2)若后面元素的值都比倒数第k个值小(或相等),则倒数第k个元素到倒数第一个元素形成一个非严格递减序列,则k--,继续(1);