31. Next Permutation-- 数组处理题

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

猜你喜欢

转载自www.cnblogs.com/keepAC/p/9955929.html