生成字典序,交换 + 逆序
生成字典序的方法:
1. 从后向前,寻找第一个正序对,即num[i] < num[i+1]
2. 从后向前,寻找第一个大于num[i]的数字,即num[i]<num[j]
3. 交换num[i]和num[j]
4. 将num[i+1...]转为逆序
如果第1步找不到这样一个i,说明已经是字典序的最后一个序列了,此时将数字恢复成第一序列,即从小到大排序。
代码:
1 void nextPermutation(vector<int> &num) { 2 int i = num.size() - 2; 3 while (i >= 0 && num[i] >= num[i + 1]) 4 i--; 5 6 if (i < 0) { 7 sort(num.begin(), num.end()); 8 return; 9 } 10 11 int j = num.size() - 1; 12 while (j > i && num[j] <= num[i]) 13 j--; 14 15 swap(num[i], num[j]); 16 sort(num.begin() + i + 1, num.end(), [](int &a, int &b) {return b - a;}); 17 }