题目
原题目看不懂他在说什么,这里简单描述一下 字典序:英文字典中单次的排序方法,即比较第一个字母,相同则比较第二个字母,以此类推 本题要求给出输入数组的下一个排列,类似字典中一个单词的下一个单词 例子
[
1
,
4
,
8
,
5
,
3
,
2
,
1
]
[1, 4, 8,5,3,2,1]
[ 1 , 4 , 8 , 5 , 3 , 2 , 1 ] 的下一个是
[
1
,
5
,
1
,
2
,
3
,
4
,
8
]
[1,5,1,2,3,4,8]
[ 1 , 5 , 1 , 2 , 3 , 4 , 8 ] (
[
1
,
4
]
[1,4]
[ 1 , 4 ] 开头的已经没有更大的了,因此下一个是
[
1
,
5
]
[1,5]
[ 1 , 5 ] 开头的最小的)
思路(三步走)
观察上面的例子,可以看出由于
[
1
,
4
]
[1,4]
[ 1 , 4 ] 后面的序列是递减的,已经是最大的了,因此需要改第二位,即把
4
4
4 变大; 因此,第一步是从右往左找,发现数组不递增时
b
r
e
a
k
break
b re ak ,记下此时的索引
i
i
i 及 对应的值(上面例子中索引和值分别为
1
,
4
1,4
1 , 4 ); 第二步是寻找哪个数和
4
4
4 交换,同样从右往左找,找到第一个大于
4
4
4 的数,将其和
4
4
4 替换(上面例子中
5
5
5 和
4
4
4 替换,新的数组变为
[
1
,
5
,
8
,
4
,
3
,
2
,
1
]
[1, 5, 8,4,3,2,1]
[ 1 , 5 , 8 , 4 , 3 , 2 , 1 ] ) 第三步是将
[
1
,
5
]
[1,5]
[ 1 , 5 ] 后面的序列从递减变为递增(可用双指针),即变成
[
1
,
5
,
1
,
2
,
3
,
4
,
8
]
[1,5,1,2,3,4,8]
[ 1 , 5 , 1 , 2 , 3 , 4 , 8 ]
代码
class Solution {
public :
void nextPermutation ( vector< int > & nums) {
int n = nums. size ( ) ;
if ( n > 1 ) {
int temp;
int temp_ind;
int flag = 0 ;
for ( int i = n- 1 ; i > 0 ; i-- ) {
if ( nums[ i- 1 ] < nums[ i] ) {
temp = nums[ i- 1 ] ;
temp_ind = i- 1 ;
flag = 1 ;
break ;
}
}
if ( flag) {
for ( int i = n- 1 ; i > 0 ; i-- ) {
if ( nums[ i] > temp) {
int t = nums[ i] ;
nums[ i] = temp;
nums[ temp_ind] = t;
break ;
}
}
int pl = temp_ind + 1 , pr = n - 1 ;
while ( pl < pr) {
int t = nums[ pr] ;
nums[ pr] = nums[ pl] ;
nums[ pl] = t;
pl++ ;
pr-- ;
}
}
else {
sort ( nums. begin ( ) , nums. end ( ) ) ;
}
}
}
} ;