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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 2080. 区间内查询数字的频率(哈希+二分查找)

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2080. 区间内查询数字的频率(哈希+二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 超時解
      • 2.2 優化

1. 題目

請你設計一個數據結構,它能求出給定子數組內一個給定值的 頻率

子數組中一個值的 頻率 指的是這個子數組中這個值的出現次數。

請你實現 RangeFreqQuery 類:

  • RangeFreqQuery(int[] arr) 用下標從 0 開始的整數數組 arr 構造一個類的實例。
  • int query(int left, int right, int value) 返回子數組 arr[left...right] 中 value 的 頻率

一個 子數組 指的是數組中一段連續的元素。arr[left...right] 指的是 nums 中包含下標 left 和 right 在內 的中間一段連續元素。

示例 1: 輸入: ["RangeFreqQuery", "query", "query"] [[[12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]], [1, 2, 4], [0, 11, 33]] 輸出: [null, 1, 2]解釋: RangeFreqQuery rangeFreqQuery = new RangeFreqQuery([12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]); rangeFreqQuery.query(1, 2, 4); // 返回 1 。4 在子數組 [33, 4] 中出現 1 次。 rangeFreqQuery.query(0, 11, 33); // 返回 2 。33 在整個子數組中出現 2 次。提示: 1 <= arr.length <= 10^5 1 <= arr[i], value <= 10^4 0 <= left <= right < arr.length 調用 query 不超過 10^5 次。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/range-frequency-queries
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 超時解

  • 存儲每個位置的每個數的出現次數的前綴和
class RangeFreqQuery {vector<unordered_map<int,int>> presum; public:RangeFreqQuery(vector<int>& arr) {presum.reserve(arr.size());presum.emplace_back(unordered_map<int,int>());presum[0][arr[0]] = 1;for(int i = 1; i < arr.size(); ++i){presum.emplace_back(presum.back());if(presum[i-1].find(arr[i]) == presum[i-1].end())presum[i][arr[i]] = 1;elsepresum[i][arr[i]] = presum[i-1][arr[i]]+1;}}int query(int left, int right, int value) {if(presum[right].find(value) == presum[right].end())return 0;if(left == 0 || presum[left-1].find(value) == presum[left-1].end())return presum[right][value];return presum[right][value] - presum[left-1][value];} };

2.2 優化

  • 記錄同一種數字的所有的位置,進行二分查找 left 和 right 的 位置
class RangeFreqQuery {unordered_map<int, vector<int>> pos; // 數字出現的位置 public:RangeFreqQuery(vector<int>& arr) {for(int i = 0; i < arr.size(); ++i){pos[arr[i]].push_back(i);}}int query(int left, int right, int value) {if(pos.find(value) == pos.end()) return 0;auto it1 = lower_bound(pos[value].begin(), pos[value].end(), left);auto it2 = upper_bound(pos[value].begin(), pos[value].end(), right);return it2-it1;} };

524 ms 245.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 2080. 区间内查询数字的频率(哈希+二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

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