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]
.
Main Idea:
Convert the array into BST, smaller number is the number on the left tree. Time complexity O(NlgN)
#include <vector> #include <iostream> using namespace std; struct TreeNode { TreeNode* left; TreeNode* right; int val; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void insertToBST(TreeNode* root, int num) { TreeNode* tmp = root; TreeNode* parent; while(tmp) { parent = tmp; if(tmp->val < num) { tmp = tmp->right; } else { tmp = tmp->left; } } TreeNode* tmp_1 = new TreeNode(num); if(num > parent->val) parent->right = tmp_1; else parent->left = tmp_1; } TreeNode* leftMost(TreeNode* root) { TreeNode* parent = root; TreeNode* tmp = root; while(tmp) { parent = tmp; tmp = tmp->left; } return parent; } TreeNode* convertToBST(vector<int>& nums) { TreeNode* root = new TreeNode(nums[0]); for(int i = 1; i < nums.size(); ++i) { insertToBST(root, nums[i]); } return root; } int countNumber(TreeNode* root) { if(!root) return 0; return 1 + countNumber(root->left) + countNumber(root->right); } void printTree(TreeNode* root) { if(root == NULL) return; printTree(root->left); cout << root->val << endl; printTree(root->right); } int main(void) { vector<int> nums{5,2,6,1}; TreeNode* root = convertToBST(nums); // printTree(root); int i = 0; // time complexity: O(Nlg(N)) while(i < nums.size()) { vector<int> tmp(nums.begin() + i, nums.end()); TreeNode* root = convertToBST(tmp); cout << countNumber(root->left) << endl; i++; } }