Give you an integer array (index from 0 to n-1, where n is the size of this array, value from 0 to 10000) . For each element
Ai in the array, count the number of element before this element Ai is smaller than it and return count number array.
Example
For array
[1,2,7,8,5], return [0,1,2,3,2]
Note
We suggest you finish problem Segment Tree Build, Segment Tree Query II and Count of Smaller Number before itself I first.
class Solution {
public:
class SegmentTreeNode {
public:
int start, end, count;
SegmentTreeNode *left, *right;
SegmentTreeNode(int start, int end, int count) {
this->start = start;
this->end = end;
this->count = count;
this->left = this->right = NULL;
}
};
/**
* @param A: An integer array
* @return: Count the number of element before this element 'ai' is
* smaller than it and return count number array
*/
SegmentTreeNode *buildLeft(int start, int end)
{
SegmentTreeNode *node = new SegmentTreeNode(start, end, 1);
if(start == end) return node;
node->left = new SegmentTreeNode(start, start, 1);
node->right = new SegmentTreeNode(start+1, end, 0);
return node;
}
int update(SegmentTreeNode *&node, int val)
{
if(val > node->end)
{
int res = node->count;
SegmentTreeNode *head = new SegmentTreeNode(node->start,
val, node->count+1);
head->right = new SegmentTreeNode(node->end+1, val, 1);
head->left = node;
node = head;
return res;
}
if(val < node->start)
{
SegmentTreeNode *head = new SegmentTreeNode(val,
node->end, node->count+1);
head->left = buildLeft(val, node->start-1);
head->right = node;
node = head;
return 0;
}
node->count ++;
if(node->left)
{
if(node->left->end >= val) return update(node->left, val);
return update(node->right, val) + node->left->count;
}
else
{
node->left = new SegmentTreeNode(node->start, val, 1);
node->right = new SegmentTreeNode(val+1, node->end,
node->count);
}
return 0;
}
vector<int> countOfSmallerNumberII(vector<int> &A) {
// write your code here
int len = A.size();
vector<int> res(len,0);
if(0 == len)return res;
SegmentTreeNode * root = new SegmentTreeNode(A[0], A[0], 1);
for(int i=1;i<len;i++)
{
res[i] = update(root, A[i]);
}
return res;
}
};