即對一個數組中全部元素,找出右邊小於自身的元素的個數。
如:[5,2,1,1]
返回[3,2,0,0]數組
能夠遍歷元素右邊的元素,進行比較並記錄小於其的元素個數。時間複雜度爲線性。若想下降複雜度,可經過二分查找思想下降到O(log n)。由於會隨機插入,因此採起二叉搜索樹進行記錄。spa
#include <vector> typedef int _Type; class Solution { public: typedef struct Node { _Type val; size_t leftChild; struct Node *left, *right; } Node; void freeTree(Node* p) { if (p == NULL) return; freeTree(p->left); freeTree(p->right); free(p); } size_t insert(Node* & p, _Type val) { if (p == NULL) { p = (Node*)malloc(sizeof(Node)); p->val = val; p->left = p->right = NULL; return p->leftChild = 0U; } if (p->val < val) return (p->leftChild) + 1 + insert(p->right, val); if (p->val == val) return (p->leftChild) + insert(p->right, val); ++(p->leftChild); return insert(p->left, val); } std::vector<int> countSmaller(std::vector<int>& nums) { std::vector<int> vec(nums.size()); Node* root = NULL; for (int i = nums.size() - 1; i >= 0; --i) vec[i] = insert(root, nums[i]); freeTree(root); return vec; } };
主要應用了二分查找思想。code