lilingjie2015 发表于 2017-7-4 21:45:22

Leetcode31--->Next Permutation(数字的下一个排列)

  题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序);要求原地置换,且不能分配额外的内存
  举例:
  1,2,3 → 1,3,2;
3,2,1 → 1,2,3;
1,1,5 → 1,5,1;
  解题思路:
  1. 由于要找出整数的下一个排列,且按照字典顺序,因此要找出当前排列中需要交换的的那个位,即找到从右到左第一个不满足升序的元素的前一个元素nums, 以及从右到左第一个大于nums的元素nums;
  2. 交换两个元素;因为是按字典顺序排列的,而nums是第一个大于nums的元素,此时之间的元素都是大于nums以及nums的,而nums是从右往左第一个大于nums的元素,因此的元素都是小于nums,因此当nums与nums交换后,之间的元素就是一个降序
  3. 但是由于在交换了nums和nums元素后,nums元素后面本应该是按字典顺序最小的数字组合,而之间的元素是降序的,是字典顺序的最大组合排列,因此需要将之间的数据全部逆转,才能得到字典的下一个排列组合;
  代码如下:



1 public class Solution {
2   public void nextPermutation(int[] nums) {
3         if(nums == null || nums.length < 1)
4             return;
5         int len = nums.length - 1;
6         int data = nums;
7         int index1 = -1;
8         int index2 = 0;
9         for(int i = len - 1; i >= 0; i--) // 找到从右往左第一个不满足升序的元素的前一个元素
10         {
11             if(data <= nums)
12               data = nums;
13             else
14             {
15               index1 = i;
16               break;
17             }
18         }
19         if(index1 != -1) // 表示可以找到这样的数,即给定的数字不是降序
20         {
21             for(int i = len; i >=0; i--)// 找到从右往左第一个大于第一次找到的那个元素的元素
22             {
23               if(nums > nums)
24               {
25                     index2 = i;
26                     break;
27               }
28             }
29             exchange(nums, index1, index2);//此时之间的元素都是大于nums以及nums的,而nums是从右往左第一个大于nums的元素,因此的元素都是小于nums,
         因此当nums与nums交换后,之间的元素就是一个降序

30         
31         }
32         index1 = index1 + 1;
33         while(index1 < len)// 将index1位置之后的元素全部逆转【index + 1, len】之间的元素是降序排列,而我们需要的是nums元素之后的最小排列组合
34         {
35             exchange(nums, index1, len);
36             index1 ++;
37             len --;
38         }
39   }
40   public void exchange(int[] nums, int index1, int index2)
41   {
42         int data = nums;
43         nums = nums;
44         nums = data;
45   }
46 }
页: [1]
查看完整版本: Leetcode31--->Next Permutation(数字的下一个排列)