LeetCode:下一個排列【31】
阿新 • • 發佈:2018-10-27
-- 技術分享 wid 必須 targe col int close ace
LeetCode:下一個排列【31】
題目描述
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
題目分析
什麽樣的排列將產生下一個更大的數字呢?
觀察上面這個圖,我們需要將數字 a[i-1]替換為位於其右側區域的數字中比它更大的數字,例如 a[j]。我們交換數字 a[i-1]和 a[j]。我們現在在索引 i-1處有正確的數字。
但目前的排列仍然不是我們正在尋找的排列。我們需要通過僅使用 a[i-1]右邊的數字來形成最小的排列。因此,我們需要放置那些按升序排列的數字,以獲得最小的排列。
具體的操作如下:
Java題解
class Solution { public void nextPermutation(int[] nums) { int i = nums.length-2; while(i>=0&&nums[i+1]<=nums[i]) i--; if(i>=0) { int j = nums.length-1; while(j>=0&&nums[j]<=nums[i]) j--; swap(nums,i,j); } reverse(nums,i+1); } private void reverse(int[] nums, int start) { int i = start, j = nums.length - 1; 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; } }
LeetCode:下一個排列【31】