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 replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

 


题目标签:Array

  这道题目给了我们一个array, 让我们in place 更改,改成 下一个更大的排列。 题目中给的例子都太短了。我们来挑一个长一点的例子。

  

  4,7,5,3,2  如何找到它的下一个更大的排列呢, 我们看4后面的, 7,5,3,2已经是最大的可能性了,所以只能把4换了,那只能找比4大一点的数字,5。那么结果就是

  5,7,4,3,2  这是把4和5交换之后的结果,但是这个不是4,7,5,3,2的下一个大的排列,我们需要得到的是5开头的最小的排列,所以要把5之后的array sort 一下,就变成

  5,2,3,4,7  这个就是答案。

  我们可以看出,第一步是从右边开始找,找到第一个数字,它不在从小到大的顺序里(这里从右向左看), 例子中就是 4。 如果没有找到这个数字的话,那么意味着 这个排列它是 (从左往右) 从大到小的排列。就像原题中给的例子3,2,1。 这样的话,只需要sort一下,让它恢复到最小的第一种可能性。

  接着,在找到了第一个数字4 的话,再一次从右边开始找,找到第一个比4大的数字,就是5,把这两个数字交换一下。

  最后,把5之后的array 给sort 一下,为什么要sort呢 -> 虽然我们把5换上来了,但是我们需要的仅仅是 下一个更大的排列,那么就需要把5开头的排序保持最小的值。

Java Solution:

Runtime beats 85.79%

完成日期:07/13/2017

关键词:Array

关键点:找到需要被增大的那个数字A,再找到最接近于A且比A大的数字B,互换A和B,最后把B之后的所有数字sort

 1 public class Solution
 2 {
 3     public void nextPermutation(int[] nums)
 4     {
 5         // from right to left, find the first number which is not in ascending order
 6         for(int i=nums.length-1; i>=0; i--)
 7         {
 8             if(i == 0) // meaning all number are in ascending order
 9             {
10                 Arrays.sort(nums);
11                 return;
12             }
13             else if(nums[i] > nums[i-1])
14             {
15                 // from right to left, find the first number is greater than nums[index_num]
16                 for(int j=nums.length-1; j>=i-1; j--)
17                 {
18                     if(nums[j] > nums[i-1]) // swap them
19                     {
20                         int temp = nums[i-1];
21                         nums[i-1] = nums[j];
22                         nums[j] = temp;
23                         // sort the rest numbers after i - 1
24                         Arrays.sort(nums, i, nums.length);;
25                         return;
26                     }
27                 }
28             }
29         }
30     }
31
32
33 }

参考资料:

http://www.cnblogs.com/grandyang/p/4428207.html

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

  

  

时间: 2024-11-15 23:56:39

LeetCode 31. Next Permutation (下一个排列)的相关文章

[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 replaceme

[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 replaceme

leetCode 31.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 orde

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每天一题】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

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

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 replaceme

【算法题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

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 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