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 pattern
public:
void nextPermutation(vector<int> &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<int>& 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<int> &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());
}
}
};