-
Notifications
You must be signed in to change notification settings - Fork 135
Expand file tree
/
Copy path0493-ReversePairs.cs
More file actions
58 lines (54 loc) · 1.76 KB
/
0493-ReversePairs.cs
File metadata and controls
58 lines (54 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//-----------------------------------------------------------------------------
// Runtime: 248ms
// Memory Usage: 44.6 MB
// Link: https://leetcode.com/submissions/detail/383862662/
//-----------------------------------------------------------------------------
namespace LeetCode
{
public class _0493_ReversePairs
{
public int ReversePairs(int[] nums)
{
return MergeSortAndCount(nums, 0, nums.Length - 1);
}
private int MergeSortAndCount(int[] nums, int start, int end)
{
if (start < end)
{
int mid = (start + end) / 2;
int count = MergeSortAndCount(nums, start, mid) + MergeSortAndCount(nums, mid + 1, end);
int j = mid + 1;
for (int i = start; i <= mid; i++)
{
while (j <= end && nums[i] > nums[j] * 2L)
j++;
count += j - (mid + 1);
}
Merge(nums, start, mid, end);
return count;
}
else
return 0;
}
private void Merge(int[] nums, int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
var L = new int[n1];
var R = new int[n2];
int i = 0, j = 0;
for (i = 0; i < n1; i++)
L[i] = nums[start + i];
for (j = 0; j < n2; j++)
R[j] = nums[mid + 1 + j];
i = 0; j = 0;
for (int k = start; k <= end; k++)
{
if (j >= n2 || (i < n1 && L[i] <= R[j]))
nums[k] = L[i++];
else
nums[k] = R[j++];
}
}
}
}