lintcode-medium-Permutation Index II

Posted 哥布林工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode-medium-Permutation Index II相关的知识,希望对你有一定的参考价值。

Given a permutation which may contain repeated numbers, find its index in all the permutations of these numbers, which are ordered in lexicographical order. The index begins at 1.

 

Example

Given the permutation [1, 4, 2, 2], return 3.

 

public class Solution {
    /**
     * @param A an integer array
     * @return a long integer
     */
    public long permutationIndexII(int[] A) {
        // Write your code here
        
        if(A == null || A.length == 0)
            return 1;
        
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        
        for(int i = 0; i < A.length; i++){
            if(map.containsKey(A[i]))
                map.put(A[i], map.get(A[i]) + 1);
            else
                map.put(A[i], 1);
        }
        
        long result = 1;
        
        for(int i = 0; i < A.length; i++){
            HashSet<Integer> set = new HashSet<Integer>();
            
            for(int j = i + 1; j < A.length; j++){
                if(A[j] < A[i] && !set.contains(A[j])){
                    set.add(A[j]);
                    
                    map.put(A[j], map.get(A[j]) - 1);
                    result += getNum(map);
                    map.put(A[j], map.get(A[j]) + 1);
                }
            }
            
            map.put(A[i], map.get(A[i]) - 1);
        }
        
        return result;
    }
    
    public long factor(int n){
        long result = 1;
        
        for(int i = 1; i <= n; i++)
            result = result * i;
        
        return result;
    }
    
    public long getNum(HashMap<Integer, Integer> map){
        long den = 1;
        int count = 0;
        
        for(Integer temp: map.values()){
            if(temp != 0){
                count += temp;
                den *= factor(temp);
            }
        }
        
        return factor(count) / den;
    }
    
}

 

以上是关于lintcode-medium-Permutation Index II的主要内容,如果未能解决你的问题,请参考以下文章