315. Count of Smaller Numbers After Self

分析

这道题第一反应用Brute force方法比较直接,两个For Loop解决,时间复杂度是O(n^2),很显然我们需要用时间复杂度更低的方法。

方法是在优化第二个For Loop的时候,那么唯一可以想到就是O(logn) 那么我们就可以考虑用Binary Search Tree来解决。我们可以通过在建BST的过程中找到我们想要的结果。步骤就是从最后一个元素往前开始插入Node, 插入Node的过程中面对当前Node每次Turn right的时候那么当前点及它所有左子树的节点都代表比待插入点小的元素。为了方便计算,这里的Node我们增加一个Field表示所有左子树Node及当前Node的总数量,对应在Array里的含义就是包含自己及右边比自己小的元素。

代码

class Solution {
    public List<Integer> countSmaller(int[] nums) {
        List<Integer> res = new ArrayList<>();
        if (nums == null) return res;        
        Node root = null;
        for (int i = nums.length - 1; i >= 0; i--) {
            root = insert(root, nums[i], 0, res);
        }
        Collections.reverse(res);
        return res;
    }

    public Node insert(Node root, int val, int curr, List<Integer> res) {
        if (root == null) {
            res.add(curr);
            return new Node(val);
        }
        if (val > root.val) {
            root.right = insert(root.right, val, curr + root.lessOrEualCount, res);
        } else {
            root.lessOrEualCount++;
            root.left = insert(root.left, val, curr, res);
        }
        return root;
    }

    class Node {
        Node left, right;
        int val;
        int lessOrEualCount;

        Node(int val) {
            this.val = val;
            lessOrEualCount = 1;
        }
    }
}

微斯渝
39 声望15 粉丝