[itint5]下一个排列

http://www.itint5.com/oj/#6

首先,试验的时候要拿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;

}

  

你可能感兴趣的:(int)