LeetCode BST系列(五)
315. Count of Smaller Numbers After Self
题目大意是给定一个数组,要求输出一个数组,输出的数组要求是:统计原数组每个数值右边比它小的个数,然后记录到输出的数组中。
Input: [5,2,6,1]
Output: [2,1,1,0]
Explanation:
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.
首先尝试了暴力解法,这是最容易想到的解法了,竟然能过,可见测试的数组长度还不是很大。
1 | class Solution { |
O(n²)的解法显然不是最好的,于是看了一下Discuss,选了下面这个符合BST系列的解法。首先一定要倒序遍历原数组开始构造BST,这样构造树的时候能记录所有比它小的节点的个数。至于如何记录的,就是维护两个数值,一个值是当前节点的个数(selfCount),当节点重复时,这个值便递增+1,默认是1。另一个值是所有比当前节点小的节点的个数(leftCount)。这样每次新来一个节点,当需要往右分支插入的时候,那说明比当前节点大,于是新的节点需要加上当前节点的leftCount和selfCount,而往左分支插入的时候是比当前节点小,那么当前节点需要增加一下自身的leftCount。
1 | class Solution { |
通过这道题主要是练习了一下构造BST的方法,通过记录节点状态来很好的避免之前暴力解法时重复性的比较工作,所以还是要牢记并利用好BST的性质。当然这道题还有个很巧妙的利用Fenwick Tree(Binary Indexed Tree)的解法,思路令人惊叹,我看的是花花酱的讲解。
https://zxi.mytechroad.com/blog/algorithms/array/leetcode-315-count-of-smaller-numbers-after-self/。
- 本文链接:https://chlch.github.io/2019/03/25/BST系列(五)/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。欢迎转载,但是请转载请注明出处哦!