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;
    }
    
}

 

posted @ 2016-04-04 13:16  哥布林工程师  阅读(163)  评论(0编辑  收藏  举报