在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
分析:
最簡單的解法就是遍歷陣列中的每乙個元素,讓每個元素與後面的元素對比,如果大於則逆序對數count++,但是時間複雜度是o(n2)
比較好的思路是利用分治的思想:
先求前面半部分陣列的逆序數,再求後面半部分陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數,最終求得三部分加和,如果過大進行取餘運算。
**如下:
public class solution
int copy = new int[array.length];
for(int i=0;i>1;
int leftcount = inversepairsnum(array,copy,low,mid)%1000000007;
int rightcount = inversepairsnum(array,copy,mid+1,high)%1000000007;
int count = 0;
int i=mid;//遞迴後,array的前部分和後部分已經有序。並且前部分和逆序數和後部分的逆序數都已經求出。
int j=high;
int currentindex = high;
while(i>=low&&j>mid)//從兩部分的末尾開始,在兩部分都沒有走到頭的情況下,歸併前後兩部分到copy陣列中。
}else
}while(i>=low)//前部分如果有剩餘,依次放入copy中
while(j>mid)//後部分如果有剩餘,依次放入copy中
for(int s=low;s<=high;s++)
return (leftcount+rightcount+count)%1000000007;//返回結果
}}
演算法題 求乙個數列中的逆序對個數
乙個數列,如果左邊的數大,右邊的數小,則稱這兩個數字乙個逆序對。求出乙個數列中有多少個逆序對。利用歸併排序的過程完成求逆序對問題。已知歸併過程如下 1 首先劃分劃分劃分,一直劃分到不能劃分,即每個組都只有乙個數值。2 然後合併,合併的過程就是每個二劃分排序的過程。3 在合併的時候,開闢乙個輔助陣列,...
演算法 求乙個陣列的最大子陣列
思路 1 全負數 取最大的數即可 2 存在非負數 遇見負數就不加,然後和前乙個子串行的和做比較,取大的 public class maxchildarray return items items.length 1 不是全負數的情況,sum必定大於等於0 int sum 0 int partsum 0...
求乙個陣列的子集
該題是力扣上面的乙個題,感覺思路不錯就摘抄下來做個筆記。以後準備定期耍上面的題來提高一下自己的演算法基礎。題目描述如下 給定一組不含重複元素的正數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,...