程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)
生活随笔
收集整理的這篇文章主要介紹了
程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 map
- 2.2 樹狀數組
1. 題目
假設你正在讀取一串整數。每隔一段時間,你希望能找出數字 x 的秩(小于或等于 x 的值的個數)。
請實現數據結構和算法來支持這些操作,也就是說:
-
實現 track(int x) 方法,每讀入一個數字都會調用該方法;
-
實現 getRankOfNumber(int x) 方法,返回 小于或等于 x 的值的個數。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/rank-from-stream-lcci
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 類似題目:LeetCode 315. 計算右側小于當前元素的個數(二叉查找樹&二分查找&歸并排序逆序數總結)
2.1 map
- map 存儲自己的個數,寫入時間復雜度 O(log?n)O(\log n)O(logn)
- 讀取秩的時候,從前往后遍歷加起來(小于等于x的)O(n)O(n)O(n) 時間復雜度
108 ms 13.9 MB
- map 存儲前面小于等于它的個數,讀取秩的時間復雜度 O(log?n)O(\log n)O(logn)
- 插入數以后,需要更新所有的 map 的 value,時間復雜度 O(n)O(n)O(n)
120 ms 14 MB
2.2 樹狀數組
上面解法:在 n 次操作下的時間復雜度為 O(n2)O(n^2)O(n2)
如何優化:請看樹狀數組,一次查詢和修改時間復雜度均為 O(log?n)O(\log n)O(logn)
class StreamRank {vector<int> v;int N = 50002; public:StreamRank() {v = vector<int>(N);}void track(int x) {update(x+1, 1);}int getRankOfNumber(int x) {return query(x+1);}//-----樹狀數組-------int lowbit(int x){return x&(-x);}void update(int i, int delta){for( ; i < N; i += lowbit(i))v[i] += delta;}int query(int i){int sum = 0;for( ; i > 0; i -= lowbit(i))sum += v[i];return sum;} };44 ms 20.6 MB
總結
以上是生活随笔為你收集整理的程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1367. 二叉树中的
- 下一篇: LeetCode 319. 灯泡开关(找