逆序對問題 在一個數組中,左邊的數如果比右邊的數大,則這兩個數構成一個逆序對,請打印所有逆序對。
解題思路同第一題完全相同,區別在於要找的是左邊大的,也就是p[0] > p[1]時,打印兩數組成的tuple.代碼如下:
public class ReversePairs {
public static void reversePairs(int [] arr) {
if (arr.length < 2 && arr == null){ return; }
reversePairs(arr,0,arr.length - 1);
}
public static void reversePairs(int [] arr, int l, int r){
if(l == r) { return; }
int mid = l + ((r - l) >> 1);
reversePairs(arr,l,mid);
reversePairs(arr,mid + 1,r);
merge(arr,l,mid,r);
}
public static void merge(int [] arr, int l, int m, int r){
int [] temp = new int [r - l + 1];
int i = 0;
int p0 = l;
int p1 = m + 1;
while(p0 <= m && p1 <= r) {
if (arr[p0] > arr[p1]){
System.out.println("( " + arr[p0] + " " + arr[p1] + " )");
}
temp[i++] = arr[p0] > arr[p1] ? arr[p0++] : arr[p1++];
}
while (p0 <= m){
temp[i++] = arr[p0++];
}
while (p1 <= r){
temp[i++] = arr[p1++];
}
for (i = 0; i < temp.length; i++){
arr[l + i] = temp[i];
}
}
}