日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

發布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 map
      • 2.2 樹狀數組

1. 題目

假設你正在讀取一串整數。每隔一段時間,你希望能找出數字 x 的秩(小于或等于 x 的值的個數)。

請實現數據結構和算法來支持這些操作,也就是說:

  • 實現 track(int x) 方法,每讀入一個數字都會調用該方法;

  • 實現 getRankOfNumber(int x) 方法,返回 小于或等于 x 的值的個數。

示例: 輸入: ["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"] [[], [1], [0], [0]] 輸出: [null,0,null,1]提示: x <= 50000 track 和 getRankOfNumber 方法的調用次數均不超過 2000

來源:力扣(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) 時間復雜度
class StreamRank {map<int,int> m;int count = 0; public:StreamRank() {}void track(int x) {m[x]++;}int getRankOfNumber(int x) {count = 0;for(auto& mi : m){if(x >= mi.first)count += mi.second;elsebreak;}return count;} };

108 ms 13.9 MB

  • map 存儲前面小于等于它的個數,讀取秩的時間復雜度 O(log?n)O(\log n)O(logn)
  • 插入數以后,需要更新所有的 map 的 value,時間復雜度 O(n)O(n)O(n)
class StreamRank {map<int,int> m; public:StreamRank() {}void track(int x) {auto it = m.rbegin();for(; it != m.rend(); ++it){if(it->first > x)it->second++;//有比x大的,他們的value(比它小的個數) +1elsebreak;}if(it == m.rend() || (it != m.rend() && it->first == x))m[x]++; // map遍歷到頭了,x不存在,或者x存在elsem[x] = it->second + 1;//遍歷沒到頭,x不存在,x 的 value = 前一個value + 自己}int getRankOfNumber(int x) {if(m.empty() || x < m.begin()->first)return 0;if(m.count(x))return m[x];auto end = m.upper_bound(x);end--;return end->second;} };

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/树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。