Reverse Pairs

Reverse Pairs (lintcode)

Description
For an array A, if i 
<
 j, and A [i] 
>
 A [j], called (A [i], A [j]) is a reverse pair.
return total of reverse pairs in A.

Example
Given A = [2, 4, 1, 3, 5] , (2, 1), (4, 1), (4, 3) are reverse pairs. return 3

解题思路

使用归并排序的思路,这里需要注意的是怎么对逆序对进行计数。

Java 实现

public
class
Solution
{

/**
     * 
@param
 A an array
     * 
@return
 total of reverse pairs
     */
public
long
reversePairs
(
int
[] A)
{

// Write your code here
if
 (A == 
null
 || A.length == 
0
) {

return
0
;
        }

return
 mergeSort(A, 
0
, A.length - 
1
);
    }


private
long
mergeSort
(
int
[] A, 
int
 start, 
int
 end)
{

if
 (start 
>
= end) {

return
0
;
        }


long
 sum = 
0
;

int
 mid = start + (end - start) / 
2
;
        sum += mergeSort(A, start, mid);
        sum += mergeSort(A, mid + 
1
, end);
        sum += merge(A, start, mid, end);


return
 sum;
    }


private
long
merge
(
int
[] A, 
int
 start, 
int
 mid, 
int
 end)
{

int
[] temp = 
new
int
[A.length];

int
 left = start;

int
 right = mid + 
1
;

int
 index = start;

long
 sum = 
0
;


while
 (left 
<
= mid 
&
&
 right 
<
= end) {

if
 (A[left] 
<
= A[right]) {
                temp[index++] = A[left++];
            } 
else
 {
                temp[index++] = A[right++];
                sum += mid - left + 
1
;
            }
        }

while
 (left 
<
= mid) {
            temp[index++] = A[left++];
        }

while
 (right 
<
= end) {
            temp[index++] = A[right++];
        }


for
(
int
 i = start; i 
<
= end; i++) {
            A[i] = temp[i];
        }


return
 sum;
    }
}

results matching ""

    No results matching ""