[itint5]下一个排列
首先,试验的时候要拿5个来试,3,4个都太少了。好久没做所以方法也忘了,是先从后往前找到第一个不合顺序的,然后在后面找到比这个大的最小的来交换,再把后面排序。
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
bool next_permutation(vector<int> &arr) {
bool has_next = false;
int size = arr.size();
int i = arr.size() - 1;
while (i - 1 >= 0) {
if (arr[i-1] < arr[i]) {
has_next = true;
break;
}
i--;
}
if (!has_next) return false;
// find the min after i-1
int min = INT_MAX;
int minIdx = -1;
for (int j = i; j < size; j++) {
if (arr[j] > arr[i-1] && arr[j] < min) {
min = arr[j];
minIdx = j;
}
}
int tmp = arr[i-1];
arr[i-1] = arr[minIdx];
arr[minIdx] = tmp;
// sort elements from i
sort(arr.begin()+i, arr.end());
return true;
}

浙公网安备 33010602011771号