LeetCode31.下一個排列(字典序全排列)
阿新 • • 發佈:2018-11-23
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
思路分析:
下面貼一張leetcode上官方解答動圖,有助於理解:
實現原始碼:
package Algorithm.LeetCode; /*31. 下一個排列 實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。 如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。 必須原地修改,只允許使用額外常數空間。 以下是一些例子,輸入位於左側列,其相應輸出位於右側列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1*/ import java.util.Arrays; public class Solution10 { public static void nextPermutation(int[] nums) { if(nums.length==1){ System.out.println(nums[0]); return; } if(nums.length==2){ int temp = nums[0]; nums[0] = nums[1]; nums[1] = temp; System.out.println("["+nums[0]+","+nums[0]+"]"); return; } int i = nums.length-2; for(;i >= 0;i--){ boolean flag = false; for(int j = i + 1; j < nums.length;j ++ ){ if(nums[j]>nums[i]){ flag =true; break; } } if(flag==true) break; } System.out.println(i); if(i==-1){ Arrays.sort(nums); return; } int j = i+1; int smallest = nums[j]; int index = i+1; for(;j<nums.length;j++){ if(nums[j]>nums[i]&&nums[j]<smallest){ smallest=nums[j]; index = j; } } int temp = nums[i]; nums[i] = nums[index]; nums[index] = temp; if(i==0){ Arrays.sort(nums,1,nums.length); } else{ Arrays.sort(nums,i+1,nums.length); } System.out.print("["); for(int k = 0 ; k < nums.length-1;k++){ System.out.print(nums[k]+","); } System.out.print(nums[nums.length-1]); System.out.println("]"); } public static void main(String[] args) { int [] data = {3,2,1}; nextPermutation(data); } }