题目来源:31. Next Permutation
首先要明白一件事情,如果一个数组是降序排列的,那么它就是最大的
以[1 5 8 4 7 6 5 3 1]
为例
首先从后向前寻找第一处升序的位置,4
和7
,那么可知4
之后的子数组[7 6 5 3 1]
是降序的,是最大的,表明4
的工作结束了,需要找一个恰好大于4
的数来替换它
在4
之后的降序子数组[7 6 5 3 1]
中,从后向前寻找到第一个大于4
的数,为5
,交换4
和5
,得[1 5 8 5 7 6 4 3 1]
,子数组[7 6 4 3 1]
仍然是逆序的,把这个子数组整个翻转,可得[1 5 8 5 1 3 4 6 7]
故最终的答案为[1 5 8 5 1 3 4 6 7]
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
if( n == 0 || n == 1 )
return;
// 从后向前寻找第一处升序的位置
// nums[i - 1] < nums[i]
int i;
for( i = n - 1; i > 0; i-- )
if( nums[i - 1] < nums[i] )
break;
// 如果整个数组是降序的,直接对数组进行反转
if( i == 0 )
{
reverse( nums.begin(), nums.end() );
return;
}
// 找到第一个恰好大于nums[i - 1]的数,nums[k]
int k;
for( k = n - 1; k >= i; k-- )
if( nums[k] > nums[i - 1] )
break;
// 交换nums[i - 1]和nums[k]
swap( nums[i - 1], nums[k] );
// 对nums[i..end]进行反转
reverse( nums.begin() + i, nums.end() );
}
};