[LeetCode]60 Permutation Sequence

https://oj.leetcode.com/problems/permutation-sequence/

http://blog.csdn.net/linhuanmars/article/details/22028697

public class Solution {
    public String getPermutation(int n, int k) 
    {
        // Solution A:
        // return getPermutation_AllPerms(n, k);
        
        // Solution B:
        return gerPermutation_Calc(n, k);
    }

    ////////////////////////////////////
    // Solution A: Calc
    // See http://blog.csdn.net/linhuanmars/article/details/22028697
    private String gerPermutation_Calc(int n, int k)
    {
        if(n<=0)
            return "";
        
        k--; // to 0-based
        
        List<Integer> nums = new ArrayList<>();
        
        StringBuilder sb = new StringBuilder();
        int factorial = 1;
        for(int i = 2 ; i < n ; i ++)
        {
            factorial *= i;
        }
    
        for(int i = 1 ; i <= n ; i++)
        {
            nums.add(i);
        }
    
        int round = n - 1;
        while(round >= 0)
        {
            int index = k/factorial;
            k %= factorial;
            sb.append(nums.get(index));
            nums.remove(index);
            if(round > 0)
                factorial /= round;
            round--;
        }
        return sb.toString();
    }
        
    ////////////////////////////////////
    // Solution A: All Permutations
    //
    // Calculate all permutations
    private String getPermutation_AllPerms(int n, int k)
    {
        List<String> result = new ArrayList<>();
        boolean[] used = new boolean[n];
        allPerms(n, used, "", result);
        Collections.sort(result);
        return result.get(k - 1);
    }
    
    private void allPerms(int n, boolean[] used, String cur, List<String> result)
    {
        if (cur.length() == n)
        {
            result.add(cur);
            return;
        }
        
        for (int i = 0 ; i < n ; i ++)
        {
            if (used[i])
                continue;
            
            used[i] = true;
            cur += String.valueOf(i);
            
            allPerms(n, used, cur, result);
            
            used[i] = false;
            cur = cur.substring(0, cur.length() - 1);
        }
    }
}


你可能感兴趣的:(LeetCode)