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