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

题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序);要求原地置换,且不能分配额外的内存

举例:

1,2,3 → 1,3,2;  
3,2,1 → 1,2,3;  
1,1,5 → 1,5,1;  

解题思路:

1. 由于要找出整数的下一个排列,且按照字典顺序,因此要找出当前排列中需要交换的的那个位,即找到从右到左第一个不满足升序的元素的前一个元素nums[index1], 以及从右到左第一个大于nums[index1]的元素nums[index2];

2. 交换两个元素;因为是按字典顺序排列的,而nums[index2]是第一个大于nums[index1]的元素,此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序

3. 但是由于在交换了nums[index1]和nums[index2]元素后,nums[index2]元素后面本应该是按字典顺序最小的数字组合,而[index1 + 1,结尾]之间的元素是降序的,是字典顺序的最大组合排列,因此需要将[index1 + 1, 结尾]之间的数据全部逆转,才能得到字典的下一个排列组合;

代码如下:

 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[len];
 7         int index1 = -1;
 8         int index2 = 0;
 9         for(int i = len - 1; i >= 0; i--) // 找到从右往左第一个不满足升序的元素的前一个元素
10         {
11             if(data <= nums[i])
12                 data = nums[i];
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[i] > nums[index1])
24                 {
25                     index2 = i;
26                     break;
27                 }
28             }
29             exchange(nums, index1, index2);  //此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],         因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序
30
31         }
32         index1 = index1 + 1;
33         while(index1 < len)  // 将index1位置之后的元素全部逆转【index + 1, len】之间的元素是降序排列,而我们需要的是nums[index1]元素之后的最小排列组合
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[index1];
43         nums[index1] = nums[index2];
44         nums[index2] = data;
45     }
46 }
时间: 2024-12-02 21:09:30

Leetcode31--->Next Permutation(数字的下一个排列)的相关文章

[C++]LeetCode: 79 Next Permutation (下一个排列,常见面试题)

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The repla

LeetCode 31 Next Permutation(下一个排列)

翻译 实现"下一个排列"函数,将排列中的数字重新排列成字典序中的下一个更大的排列. 如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序). 重排必须在原地,不分配额外的内存. 以下是一些示例,左侧是输入,右侧是输出: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 原文 Implement next permutation, which rearranges numbers into the lexicographically

【LeetCode每天一题】Next Permutation(下一个排列)

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

Leetcode:Next Permutation 下一个排列

Next Permutation: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending ord

LeetCode 31. 下一个排列(Next Permutation)

题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路 由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例,寻找下一个排列的步骤是: 首先找到从后往前第一个升序数对,在此例中即(1

leetcode31题:下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 代码如下: public class Solution { public void nextPermutation(int[] nums) { int i = num

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1

leetcode 31. Next Permutation(字典序的下一个)

描述: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The repla

【算法题7】寻找下一个排列

来自:LeetCode 37 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 解决方案: 参见博客:Next lexicographical permutation algorithm 代码如下: 1 class