這道題第一反應用Brute force方法比較直接,兩個For Loop解決,時間複雜度是O(n^2),很顯然咱們須要用時間複雜度更低的方法。less
方法是在優化第二個For Loop的時候,那麼惟一能夠想到就是O(logn) 那麼咱們就能夠考慮用Binary Search Tree來解決。咱們能夠經過在建BST的過程當中找到咱們想要的結果。步驟就是從最後一個元素往前開始插入Node, 插入Node的過程當中面對當前Node每次Turn right的時候那麼當前點及它全部左子樹的節點都表明比待插入點小的元素。爲了方便計算,這裏的Node咱們增長一個Field表示全部左子樹Node及當前Node的總數量,對應在Array裏的含義就是包含本身及右邊比本身小的元素。oop
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; } } }