思路:
1) 从数组尾部开始,找一个递增序列,直到出现A[k] < A[k+1](注意不能是等于);
2) 从A[k]开始向后搜索A[i],使得A[i]与A[k]的差是最小的(因为后面所有的数都比A[k]大,这里找一个差就小就是最接近A[k]),交换A[i] 和 A[k];
3)反转A[k]后面子序列,不包含A[k]。
code:
class Solution {
public:
void swap(int& a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
void reverseArray(vector<int>::iterator begin, vector<int>::iterator end) {
while (begin < end) {
swap(*begin,*end);
begin++;
end--;
}
}
void nextPermutation(vector<int> &A) {
int len = A.size(), index=-1;
for(int i=len-1;i>=1;i--)
if(A[i-1] < A[i]){//注意不能包含等于
index = i-1;
break;
}
if(index ==-1 ){
reverseArray(A.begin(),A.end()-1);
return;
}
int minV = A[index+1] - A[index], indexCh = index+1;
for(int i = index+2;i < len;i++){
if(A[i] > A[index] && A[i] - A[index] <= minV){//注意等于号不要丢到
minV = A[i] - A[index];
indexCh = i;
}
}
swap(A[index],A[indexCh]);
reverseArray(A.begin()+index+1,A.end()-1);
}
};