對於從1到A * B的所有不同數字的A * B矩陣,我們首先對每列進行排序,然後按指數遞增順序連接所有列,以形成大小爲A * B的數組。按從左到右的順序依次編號。不同的初始矩陣
例如,如果基質是
[1 5 6] [3 2 4]
我們首先排序的所有列以獲得
[1 2 4] [3 5 6 ]
現在,我們串聯列中增加索引的次序來獲得的數組
[1,3,2,5,4,6]
給出這個最終數組,你必須計算有多少不同的初始矩陣是可能的。以10^9 + 7模數返回所需的答案。
兩個矩陣是不同的,如果: - 它們的尺寸不同。 - 或者如果兩個矩陣中的相應行有任何不同。
實施例:
如果輸入數組是[1,3,2,4],可能的不同初始矩陣是:
[1 3 2 4]
====== ======
[1 2]
[3 4]
=============
[1 4]
[3 2]
===========
[3 2]
[1 4]
===========
[3 4]
[1 2]
===========
即,總共5點矩陣。
這是做了什麼: 我找到了我們可以在每個大小的子數組(len/2)中排列值的方法。因此,如果一個數組[1,2,3,4] 我們有兩個子數組[1,2] & [3,4]。所以答案將是2!* 2!.Thing是我們必須得到的獨特的行也是如此。那就是我的代碼失敗的地方。 你能否在正確的方向給我啓發。 這是我的代碼;
public int cntMatrix(ArrayList<Integer> a) {
if(a.size()==1){
return 1;
}
int n=a.size();
int len=n/2;
int i=0;
long ans=1;
if(n%2!=0){ //n is odd
ans=fact(n); //factorial function
}else{
while(i<n){
int x=i;
int y=i+len;
HashMap<Integer,Integer> map=new HashMap<>(); //frequency of each element in subarray[x..y]
for(int m=i;m<y;m++){
if(map.containsKey(a.get(m))){
map.put(a.get(m),map.get(a.get(m))+1);
}else{
map.put(a.get(m),1);
}
}
long p=fact(len);
long q=1;
for(Map.Entry<Integer,Integer> set:map.entrySet()){
int key=set.getKey();
int value=set.getValue();
q*=fact(value);
}
ans*=p/q; //ncr
map.clear();
i+=len;
}
}
ans%=1000000007;
return ((int)ans+1);
}
如何應對唯一的行
詢及interviewbit.com
好的,但既不是電腦也不知道你是如何失敗,除非你顯示你的代碼 – emotionlessbananas
@I_Am_Innocent:對不起。我在這裏是新的,沒有注意到代碼不在那裏。總是愉快地編輯。 –