竟然被这么一道简单题折腾了好久,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 里的方法, 其实不用排序,在每次比较的过程中就可以排序好,最后反转整个数组也可以,但似乎效率还没我这种写法高。