很诡异的题,看了好几遍题没看懂说什么,然后去搜了一下,方法如下:
- 从右往左遍历 找到第一个索引
满足:
,如果不存在就反转整个数组
- 再找第二个索引
,满足:
- 交换
和
- 最后从
开始反转整个数组
class Solution {
public void nextPermutation(int[] nums) {
int length = nums.length;
int k = -1, l = -1;
for (int i = length - 2; i >= 0; i--) {
if (nums[i] < nums[i+1]){
k = i;
break;
}
}
if (k == -1){
reverse(nums,0,length - 1);
return;
}
for (int i = length - 1; i >= 0; i--) {
if (nums[i] > nums[k]){
l = i;
break;
}
}
swap(nums, k, l);
reverse(nums, k+1, length - 1);
}
private void reverse(int[] nums, int start, int end) {
while (start < end){
swap(nums,start++,end--);
}
}
private void swap(int[] nums, int start, int end) {
nums[start] = nums[start] ^ nums[end];
nums[end] = nums[start] ^ nums[end];
nums[start] = nums[start] ^ nums[end];
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。