思路:
题目的意思是:下一个更大的排列,当把一个较大的数放前面后,后面的所有数都得是升序,否则就不是下一个更大的数,而是下好几个了
代码:
class Solution {
public void nextPermutation(int[] nums) {
int n=nums.length;
//这里是n-2,否则会越界
int i=n-2;
while(i>=0&&nums[i]>=nums[i+1]){
i--;
}
//一定要加if(i>=0)的判断,否则会越界
if(i>=0){
int j=n-1;
while(j>=0&&nums[j]<=nums[i]){
j--;
}
swap(nums,i,j);
}
reverse(nums,i+1);
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
private void reverse(
int[] nums,int start
){
int end=nums.length-1;
//注意剪枝
while(start<end){
swap(nums,start,end);
start++;
end--;
}
}
}
分解:
1)第一次扫描:这里是n-2,否则会越界
int i=n-2;
第二次扫描:要加上if(i>=0)的判断,否则会越界
2)reverse函数要注意剪枝:
while(start<end){
swap(nums,start,end);
start++;
end--;
}
复杂度分析:
时间复杂度:O(N)进行了2次扫描,每次都是遍历N个元素
空间复杂度:O(1)原地修改,没有额外空间的消耗