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

[leetcode] 60. 第k个排列

时间:2018-07-24 00:07:39      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:sequence   else   desc   boolean   app   pen   oid   string   for   

60. 第k个排列

还是使用之前用过多次的nextPermutation方法。。。(几乎所有跟排列相关的题都是同一个题- -)

class Solution {
    public String getPermutation(int n, int k) {
        int[] nums = new int[n];
        for (int i = 1; i <= n; i++) {
            nums[i - 1] = i;
        }
        while (k > 1) {
            nextPermutation(nums);
            k--;
        }
        StringBuilder ans = new StringBuilder();
        for (int num : nums) {
            ans.append(num);
        }
        return ans.toString();
    }

    // 当没有下一个排列时return false
    public boolean nextPermutation(int[] nums) {
        if (nums.length == 1) {
            return false;
        }
        int p = -1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]) {
                p = i;
                break;
            }
        }

        if (p != -1) {
            int tmp = nums[p];
            int q = nums.length - 1;
            while (nums[q] <= tmp) {
                q--;
            }

            nums[p] = nums[q];
            nums[q] = tmp;

            reverse(p + 1, nums);
        } else {
//            reverse(0, nums);
            return false;
        }

        return true;
    }

    public void reverse(int k, int[] nums) {
        if (k >= nums.length) return;
        int i = k;
        int j = nums.length - 1;
        while (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
}

[leetcode] 60. 第k个排列

标签:sequence   else   desc   boolean   app   pen   oid   string   for   

原文地址:https://www.cnblogs.com/acbingo/p/9357612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!