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


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

相关文章推荐

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

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

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

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

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

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

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

LeetCode 31 Next Permutation (下一个排列)

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

LeetCode 31 Next Permutation(下一个排列)

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

[Leetcode] 31. Next Permutation 解题报告

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

字典序排列- STL next_permutation、DFS(深度优先搜索)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典...

next_permutation函数 字典序排列

原文地址 http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html 这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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