leetCode 31.Next Permutation (下一个字典序排序) 解题思路和方法

原创 2015年07月08日 13:41:44
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


思路:此题是我目前做过的leetCode中感觉最难的题,它的难在于算法很难自己短时间实现,如果以前没有做过这样的题,几乎很难很快的有思路解出来。在参考网上资料之前,我也尝试了好几种解法,但是没有一种能达到效果。最后参考资料,才恍然:这尼玛也可以这样做,但是臣妾很难想到啊!

题目的整体思路是,从后往前读,当后面的数比前面的数大时,在开一个循环,从后开始于当前数比较,当比当前数大时,交换。然后再从当前数的后一位开始,直到最后反序即可。

具体代码和注释如下:

public class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length <= 1){
            return;
        }
        for(int i = nums.length - 1;i > 0; i--){
            if(nums[i] > nums[i-1]){//如果nums[i] > nums[i-1]
                //再从后往前判断有否数字比nums[i-1]大
            	int j = nums.length - 1;
                for(; j >= i -1;j--){
                	if(nums[j] > nums[i-1]){
                		break;//如有,则结束循环,保留j的值
                	}
                }
                //将nums[j]和nums[i-1]交换
                int temp = nums[j];
                nums[j] = nums[i-1];
                nums[i-1] = temp;
                
                //从i开始反序(即交换位置的地方开始反序)
                for(j = 0; j < (nums.length - (i))/2;j++){
                	int k = nums.length - 1 - j;
                	int m = nums[j+i];
    	            nums[j+i] = nums[k];
    	            nums[k] = m;
                }
                return;
            }
        } 
        //如果到最后没有交换的数据,则说明是降序排列,需要升序排列
        for(int i = 0; i < nums.length/2;i++){
            int j = nums.length - 1 - i;//双指针排序,交换首尾对应的两两数据即可
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater ...

leetcode解题之31. Next Permutation java 版(下一个排列)

leetcode解题之31. Next Permutation java 版(下一个排列)

求字典序的下一个排列(对应lc的Next Permutation)

如果字典序的下一个排列不存在,则返回升序排序。 过程如下: (1) 求满足关系式pj-1        I=max{ j | pj-1 (2) 求满足关系式pj-1 (3) 交换pj-1和ph的值 (...

每日算法之二十七:Next Permutation(下一个字典序)

求解的是下一个字典序,下面给出两个不同理解方式的字典序的定义:可以直接看第二种定义,但是算法还是用官方的定义来求解。 1)官方定义:字典序法是由当前序列直接生成下一个排列的算法:排列定义:P = P...
  • yapian8
  • yapian8
  • 2014年06月02日 15:20
  • 986

Leetcode刷题记——31. Next Permutation(下一个排列)

一、题目叙述: Implement next permutation, which rearranges numbers into...

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

原题网址:https://leetcode.com/problems/next-permutation/ Implement next permutation, which rearranges ...
  • jmspan
  • jmspan
  • 2016年05月20日 10:36
  • 174

LeetCode 31 Next Permutation (下一个排列)

一,问题描述 1 ,实现”下一个排列“函数,将排列中的数字重新排列成字典序列中的下一个更大的排列。如果这样的重新排列是不可能的,它必须重新排列成可能的最低顺序(即升序排序)   重排必须在原地,...

LeetCode 31 Next Permutation(下一个排列)

翻译实现下一个排列,将排列中的数字重新排列成字典序中的下一个更大的排列。如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即,升序排序)。重排必须在原地,不分配额外的内存。这里有些例子。输...
  • NoMasp
  • NoMasp
  • 2015年11月18日 22:40
  • 6244

[Leetcode] 31. Next Permutation 解题报告

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater p...

STL之 next_permutation函数{(全排列)按字典序!!!!!}

next_permutation函数  今天做题时,用到了这个函数,亮瞎我的双眼~~~ 先贴出来题目!!!!!! Description You are to ...
  • bmamb
  • bmamb
  • 2015年07月28日 19:06
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetCode 31.Next Permutation (下一个字典序排序) 解题思路和方法
举报原因:
原因补充:

(最多只允许输入30个字)