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:
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]
.
这个题目的意思是返回每个数字右边比它小的数字个数,如果按照暴力破解需要O(n2)的时间复杂度,这里利用一个状态有序数组利用二分查找找到每次应该插入元素的位置,然后返回当前元素的下标就是所求的结果。当然也可以利用stl中low_bound等算法来查找。
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
int n = nums.size();
vector<int> result(n);
vector<int> temp;
for(int i=n-1;i>=0;i--)
{
int low = 0;
int high = temp.size();
while(low<high)
{
int mid = (low+high)/2;
if(temp[mid]<nums[i])
low = mid+1;
else
high = mid;
}
result[i]= low;
temp.insert(temp.begin()+low,nums[i]);
}
return result;
}
};