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; } }
时间: 2024-10-07 06:07:57