Count of Smaller Numbers After Self
解题思路
解法有:
- 构建二叉搜索树(但是没法保证是平衡二叉树,极端情况复杂对会退化)
- 归并排序,实在太屌的思维了,详细见这个 Discuss
代码
// 神仙下凡
// https://leetcode.com/problems/count-of-smaller-numbers-after-self/discuss/138154/The-C%2B%2B-merge-sort-template-for-pairs-'i'-'j'-problem
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
vector<vector<int>> hold;
int n = nums.size();
for (int i = 0; i < n; ++i) hold.push_back(vector<int>({nums[i], i})); // "zip" the nums with their indices
vector<int> count(n, 0);
sort_count(hold.begin(), hold.end(), count);
return count;
}
typedef vector<vector<int>>::iterator iterator;
void sort_count(iterator l, iterator r, vector<int>& count) {
if (r - l <= 1) return;
iterator m = l + (r - l) / 2;
sort_count(l, m, count);
sort_count(m, r, count);
for (iterator i = l, j = m; i < m; i++) {
while (j < r && (*i)[0] > (*j)[0]) j++;
count[(*i)[1]] += j - m; // add the number of valid "j"s to the indices of *i
}
inplace_merge(l, m, r);
}
};