Count of Smaller Numbers After Self

Count of Smaller Numbers After Self 題解


題目描述

Count of Smaller Numbers After Self
即對一個數組中全部元素,找出右邊小於自身的元素的個數。
如:[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

相關文章
相關標籤/搜索