Skip to content

Commit cbc410f

Browse files
committed
315. Count of Smaller Numbers After Self
1 parent 0116b52 commit cbc410f

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
3+
1. 아이디어 : 머지 소트 방식 활용. 병합정렬중 Merge 단계에서, 왼쪽 배열의 값이 오른쪽 배열의 값보다 크다면,
4+
오른쪽 배열의 값이 왼쪽 배열의 값보다 작다는 의미이므로, count를 증가시킨다
5+
6+
2. 시간복잡도 : O(NlogN)
7+
8+
3. 자료구조/알고리즘 : 머지소트
9+
10+
*/
11+
12+
class Solution {
13+
private int[] count;
14+
15+
private class Pair {
16+
int val;
17+
int index;
18+
19+
Pair(int val, int index) {
20+
this.val = val;
21+
this.index = index;
22+
}
23+
}
24+
25+
public List<Integer> countSmaller(int[] nums) {
26+
int n = nums.length;
27+
count = new int[n];
28+
29+
Pair[] pairs = new Pair[n];
30+
for (int i = 0; i < n; i++) {
31+
pairs[i] = new Pair(nums[i], i);
32+
}
33+
34+
mergeSort(pairs, 0, n - 1);
35+
36+
List<Integer> result = new ArrayList<>();
37+
for (int c : count) {
38+
result.add(c);
39+
}
40+
return result;
41+
}
42+
43+
private void mergeSort(Pair[] pairs, int left, int right) {
44+
if (left >= right) return;
45+
46+
int mid = left + (right - left) / 2;
47+
mergeSort(pairs, left, mid);
48+
mergeSort(pairs, mid + 1, right);
49+
50+
merge(pairs, left, mid, right);
51+
}
52+
53+
private void merge(Pair[] pairs, int left, int mid, int right) {
54+
Pair[] temp = new Pair[right - left + 1];
55+
int i = left;
56+
int j = mid + 1;
57+
int k = 0;
58+
int rightCount = 0;
59+
60+
while (i <= mid && j <= right) {
61+
if (pairs[j].val < pairs[i].val) {
62+
rightCount++;
63+
temp[k++] = pairs[j++];
64+
} else {
65+
count[pairs[i].index] += rightCount;
66+
temp[k++] = pairs[i++];
67+
}
68+
}
69+
70+
while (i <= mid) {
71+
count[pairs[i].index] += rightCount;
72+
temp[k++] = pairs[i++];
73+
}
74+
75+
while (j <= right) {
76+
temp[k++] = pairs[j++];
77+
}
78+
79+
System.arraycopy(temp, 0, pairs, left, temp.length);
80+
}
81+
}

0 commit comments

Comments
 (0)