31. Next Permutation-- 陣列處理題
阿新 • • 發佈:2018-11-14
竟然被這麼一道簡單題折騰了好久,WA了很多次。
演算法: 從後往前找,找到a[i-1] 時,從i 到len 中 最小的 但大於 a[i-1]的數,並且交換。 交換後把i 到 len 進行排序。
code 如下: 一開始下標沒處理好,21行少了個break, 只得讓24行變成 i+2 ,但這樣又涵蓋不了整個陣列是遞減排列的情況。
Arrays.sort(nums,i+2,nums.length);
1 class Solution { 2 public void nextPermutation(int[] nums) { 3 if(nums == null|| nums.length<2) return; 4 int len = nums.length; 5 int i = 0; 6 int minMore = Integer.MAX_VALUE; 7 int minMore_i = 0; 8 boolean flag = false; 9 for(i= len-2; i>=0 ; i--){ 10 for(int j=i+1; j<len; j++){ 11 if(nums[i]<nums[j]){12 if(nums[j] <minMore){ 13 minMore = nums[j]; 14 minMore_i = j; 15 flag = true; 16 } 17 } 18 } 19 if(flag){ 20 swap(nums,i,minMore_i); 21 break; 22 } 23 } 24 Arrays.sort(nums,i+1,nums.length); 25 } 26 27 private void swap(int[] nums, int i, int j){ 28 int tmp = nums[i]; 29 nums[i] = nums[j]; 30 nums[j] = tmp; 31 } 32 }
按照soluation 裡的方法, 其實不用排序,在每次比較的過程中就可以排序好,最後反轉整個陣列也可以,但似乎效率還沒我這種寫法高。