题目:You are given an integer array nums and you have to return a new counts array. The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].
Example 1:
Given nums = [5, 2, 6, 1]
To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.
Return the array [2, 1, 1, 0].
思路: 这道题目也就是让我们求出数组中小于当前元素并且位于当前元素右边的元素个数。可以使用二分查找法+插入排序的方法,先构建一个新的数组,从后往前遍历原数组元素,对于当前元素,在新数组中利用二分查找法找到该元素应该插入的位置,将该元素插入到新数组中,而该位置的下标就是小于该元素并且位于该元素右边元素的个数 。 代码如下:
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
vector<int> t, res(nums.size());
for (int i = nums.size() - 1; i >= 0; --i) {
int left = 0, right = t.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (t[mid] >= nums[i]) right = mid;
else left = mid + 1;
}
res[i] = right;
t.insert(t.begin() + right, nums[i]);
}
return res;
}
};