本文共 2131 字,大约阅读时间需要 7 分钟。
class Solution {//from right to left find the minimum larger number to replace the current number//once find, swap(current, minimum larger number), then sort(current+1, end)//find out the regular patternpublic: void nextPermutation(vector &num) { // Start typing your C/C++ solution below // DO NOT write int main() function bool flag = false; for (int i = num.size()-2; i >= 0; --i) { int index = findNearestLarge(i, num.size()-1, num); if(index != -1) { swap(num[i], num[index]); sort(num.begin()+i+1, num.end()); flag = true; break; } } if(!flag) sort(num.begin(), num.end()); } int findNearestLarge( int regionStart, int regionEnd , vector & num) { //throw std::exception("The method or operation is not implemented."); int flag = false; int minIdx = -1; for (int i = regionStart; i <= regionEnd; ++i) { if (num[i] > num[regionStart]) { if(minIdx == -1) minIdx = i; else if (num[minIdx] > num[i]) minIdx = i; } } return minIdx; }};
second time
class Solution {public: void nextPermutation(vector &num) { // Start typing your C/C++ solution below // DO NOT write int main() function if(num.size() == 0) return; int maxReverse = num[num.size()-1]; int index = -1; for(int i = num.size()-2; i >= 0; --i) { if(maxReverse > num[i]) { index = i; break; } else maxReverse = max(maxReverse, num[i]); } //not found if(index == -1) { sort(num.begin(), num.end()); return; } else { //find the minimum bigger element int minNum = num[index+1]; int minIdx = index+1; for(int i = index+1; i < num.size(); ++i) { if(num[i] > num[index] && num[i] < minNum) { minNum = num[i]; minIdx = i; } } swap(num[index], num[minIdx]); sort(num.begin()+index+1, num.end()); } }};
转载地址:http://ymxti.baihongyu.com/