在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
題目保證輸入的陣列中沒有的相同的數字
對於%50的資料,size<=10^4對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
輸入1,2,3,4,5,6,7,0輸出7
首先我很糾結乙個問題,這個樹是大於後面的所有數呢?還是只是大於後面的乙個數呢?後來轉念一想,自己真的傻,要是只大於後面所有數字,那不是只有乙個才能滿足條件嗎?最後的逆序對不就是只有乙個?所有肯定是該數字大於它後面的數字,這樣的兩個數組成逆序對啊!
然後,想明白這裡,直接開幹。emmm,直接乙個類似於氣泡排序的玩意就來了。果然超時了,時間複雜的為o(n^n)了。。。
public
class
solution}}
int result = p%
1000000007
;return result;
}}
既然這種方法可行,那說明只需要改進「排序」的方式就ok了啊。於是嘗試一手歸併求。複習歸併排序的傳送門:面試必備–八大排序演算法
//歸併排序
public
static
void
mergesort
(int
arr,
int low,
int high)
}public
static
void
merge
(int
arr,
int low,
int middle,
int high)
else
index++;}
//處理多餘的資料
while
(j<=high)
while
(i<=middle)
//把臨時陣列中的資料重新存入原陣列
for(
int k=
0;k)}
我承認 這段** 是別人的。因為我完全沒理解為什麼但是在遞迴的時候,就計算了結果的大小cnt = (cnt + (mid-i+1))%1000000007
;,而不是求出逆序個數在進行求模運算。。。難道遞迴不會影響到結果嗎?噢。。。原來是每個結果求模相加結果也不變啊。。
public
class
solution
private
void
mergeone
(int
array,
int start,
int mid,
int end)
}while
(i<= mid)
temp[k++
]= array[i++];
while
(j<=end)
temp[k++
]= array[j++];
for(
int l=
0; lpublic
intinversepairs
(int
array)
}
劍指offer32 醜數
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。題意理解 1.直接法。逐個判斷每個整數是不是醜數的解法,直觀但不夠高效 所謂乙個數m是另乙個數n的因子,是指n能被m整除,...
劍指 offer32(一 二 三)
劍指 offer 32 i.從上到下列印二叉樹 思路 利用雙端佇列,每次從雙端佇列的隊頭取出節點,如果該節點存在左子樹和右子樹,則加入隊尾。vector int levelorder treenode root vector int res deque dequetreenode dequetree...
劍指Offer (32)把陣列排成最小的數
題目描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。實現如下 要將所有元素組合成乙個最小的數 那麼組合的相鄰元素之間都是num1num2的形式 所以使用庫函式的sort將各個元素以str...