題目地址:
https://leetcode-cn.com/probl...java
題目描述:
實現獲取下一個排列的函數,算法須要將給定數字序列從新排列成字典序中下一個更大的排列。算法
若是不存在下一個更大的排列,則將數字從新排列成最小的排列(即升序排列)。數組
必須原地修改,只容許使用額外常數空間。函數
如下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1code
解答:
直接給出步驟:
1從右到左掃描數組找出第一個升序對(nums[j-1],nums[j])
2從右到左掃描數組找出第一個大於nums[j-1]的數nums[k]
3交換nums[j-1],nums[k]
4對num[j...nums.length-1]轉置。leetcode
java ac代碼:get
class Solution { public void nextPermutation(int[] nums) { boolean flag = true; int i = 0; for(;i < nums.length-1;i++) if(nums[i] < nums[i+1]) { flag = false; break; } if(flag) { int x = 0,y = nums.length-1; while(x < y) { swap(nums,x,y); x++; y--; } } else { i = nums.length-1; while(i >= 1) if(nums[i] <= nums[i-1])i--; else break; int j = nums.length-1; for(;j >= 0;j--) if(nums[j] > nums[i-1])break; swap(nums,i-1,j); int x = i,y = nums.length-1; while(x < y) { swap(nums,x,y); x++; y--; } } } void swap(int[] nums,int x,int y) { int temp = nums[x]; nums[x] = nums[y]; nums[y] = temp; } }