码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Next Permutation

时间:2015-10-01 21:43:59      阅读:224      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!