題目描述
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
題目代碼
public void nextPermutation(int[] nums) {
int i = nums.length-2;
// 1.從後往前尋找第一個升序對
// 過濾降序數列
while(i>=0 && nums[i]>=nums[i+1]){
i--;
}
// (i,i+1)爲一個升序對即nums[i]<nums[i+1]
// 2.如果i找得到,尋找儘可能小的nums[k]>num[i]
if(i>=0){
int k = nums.length-1;
// 從後往前,尋找第一個大於num[i] 的 nums[k]
while(nums[k]<=nums[i]){
k--;
}
swap(nums,i,k);
}
// 逆置數組
// 顯然,如果i找不到就是-1,那麼會逆置整個數組
reverseNums(nums,i+1,nums.length-1);
}
private void reverseNums(int[]nums,int start,int end){
int i=start,j=end;
while(i<j){
swap(nums,i,j);
i++;
j--;
}
}
private void swap(int[]nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}