[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;
}

  

posted @ 2014-01-19 14:04  阿牧遥  阅读(160)  评论(0编辑  收藏  举报