左神基礎班02、陣列中的逆序對
題目描述:
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個陣列,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
示例1:
輸入
1,2,3,4,5,6,7,0
輸出
7
原題連結:陣列中的逆序對
解題思路:
1、歸併排序 + 遞迴:
可以利用歸併排序的思想,基本過程和歸併排序一樣,只不過在合併兩個子陣列時統計逆序對數量即可。設兩個排好序(逆序)的子陣列分別為arr[l,mid]和arr[mid + 1,l],指標p1和p2分別指向左右子陣列中的元素。具體的計算小和過程如下:
(1)當arr[p1] > arr[p2]
時,則計算逆序對的數量,計算方式為res += r - p2 + 1,並將arr[p1]賦值給輔助陣列help: help[i++] = arr[p1]
。
(2)當arr[p1] <= arr[p2]
時,則不用計算小和,直接將arr[p2]賦值給輔助陣列help: help[i++] = arr[p2]
。
遞迴終止條件: 當l == r
,返回0。
注:(1)在每一步完成統計完逆序對的數量後,記得進行取餘操作。
時間複雜度和空間複雜度: 時間複雜度為O(NlogN),空間複雜度為O(N)。
實現程式碼:
public class Solution {
//解法1:歸併排序 + 遞迴
public int InversePairs(int [] array) {
if(array == null || array.length < 2)
return 0;
return inverseMerge(array, 0, array.length - 1);
}
public int inverseMerge(int[] arr, int l, int r){
if(l == r)
return 0;
int mid = l + ((r - l) >> 1);
int res = 0;
//注意這裡每一步都要取餘
res = (res + inverseMerge(arr, l, mid)) % 1000000007;
res = (res + inverseMerge(arr, mid + 1, r)) % 1000000007;
res = (res + merge(arr, l, mid, r)) % 1000000007;
return res;
}
public int merge(int[] arr, int l, int mid, int r){
int res = 0, i = 0;
int p1 = l, p2 = mid + 1;
int[] help = new int[r - l + 1];
while(p1 <= mid && p2 <= r){
res = (res + (arr[p1] > arr[p2] ? r - p2 + 1 : 0)) % 1000000007;
help[i++] = arr[p1] > arr[p2] ? arr[p1++] : arr[p2++];
}
while(p1 <= mid){
help[i++] = arr[p1++];
}
while(p2 <= r){
help[i++] = arr[p2++];
}
for(i = 0; i < help.length; ++i){
arr[l + i] = help[i];
}
return res;
}
}
相關文章
- 陣列中的逆序對陣列
- JZ-035-陣列中的逆序對陣列
- 劍指Offer-37-陣列中逆序對陣列
- 樹狀陣列和逆序對陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 陣列元素逆序陣列
- HDU 2689 Sort it【樹狀陣列求逆序對】陣列
- 7-1將陣列中的數逆序存放陣列
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- 【Python】python 基礎語法之列表、n維陣列的變換(取反(逆序)\切片等)Python陣列
- Go 語言基礎 陣列、切片、對映Go陣列
- 陣列基礎使用陣列
- 陣列怎樣在python3中逆序輸出?陣列Python
- 02_陣列陣列
- 演算法基礎:動態規劃陣列中滾動陣列的使用演算法動態規劃陣列
- 樹狀陣列基礎陣列
- golang基礎之陣列Golang陣列
- JavaScript基礎——使用陣列JavaScript陣列
- JavaScript基礎(五)陣列JavaScript陣列
- JavaScript中對陣列和陣列API的認識JavaScript陣列API
- 陣列part02陣列
- 左神直通BAT演算法筆記(基礎篇)-上BAT演算法筆記
- 左神直通BAT演算法筆記(基礎篇)-下BAT演算法筆記
- JAVA基礎--二維陣列Java陣列
- NumPy 基礎 (一) - 建立陣列陣列
- Rust中陣列資料結構基礎知識Rust陣列資料結構
- C語言基礎-1、陣列C語言陣列
- Go 基礎教程--6 陣列 ArrayGo陣列
- Go 基礎教程--5 陣列 ArrayGo陣列
- NumPy 基礎 (二) - 陣列運算陣列
- 【重溫基礎】10.陣列陣列
- java基礎(十) 陣列型別Java陣列型別
- 6-Java基礎語法-陣列之一維陣列Java陣列
- [12][02][26] 刪除排序陣列中的重複項排序陣列
- 對陣列的操作陣列
- 基礎資料結構之陣列資料結構陣列
- 零基礎學Java(8)陣列Java陣列
- JavaSE基礎語法3-陣列Java陣列