首页 > 其他 > 详细

LeetCode Next Permutation

时间:2015-10-01 21:41:47      阅读:232      评论:0      收藏:0      [点我收藏+]

原题链接在这里:https://leetcode.com/problems/next-permutation/

参考了这篇博文:http://blog.csdn.net/linhuanmars/article/details/20434115

分两种情况:

1. 从前往后一路数值一直变小,如"654321", 返回的应该是"123456"也就是整个反转

2. 数值没有一直变下,如"236541", 此时从后往前找到第一个数值下降的点3<6, 找到3,记下index i,

然后从3往后开始找第一个比3 小的数, 1<3, 找到1, 记下1前一个点的index j. swap nums[i] and nums[j]. 变成"246531"

最后反转 i 后面的部分, 得到"241356".

Note: 找i的时候是 nums[i] >= nums[i+1] 等于时也往前移动i, 只有小于时才停下。

AC Java:

public class Solution {
    public void nextPermutation(int[] nums) {
        //以2,3,6,5,4,1为例
        //从后往前,找到第一个变小的的数字,如3
        //从3的下一位开始向后找到第一个比3小的数字的前一个数,1比3小,1前面的数是4
        //调换3 和 4,然后反转 调换后 4后面的数字
        if(nums == null || nums.length == 0){
            return;
        }
        int i = nums.length -  2;
        while(i>=0 && nums[i]>=nums[i+1]){
            i--;
        }
        if(i>=0){
            int j = i+1;
            while(j<nums.length && nums[j]>nums[i]){
                j++;
            }
            j--;
            swap(nums, i,j);
        }
        reverse(nums,i+1,nums.length-1);
    }
    private void swap(int [] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    private void reverse(int [] nums, int i, int j){
        while(i<j){
            swap(nums,i++,j--);
        }
    }
}

 

LeetCode Next Permutation

原文:http://www.cnblogs.com/Dylan-Java-NYC/p/4851574.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!