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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5895. 获取单值网格的最小操作数

發(fā)布時(shí)間:2023/11/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5895. 获取单值网格的最小操作数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

5895. 獲取單值網(wǎng)格的最小操作數(shù)

給你一支股票價(jià)格的數(shù)據(jù)流。數(shù)據(jù)流中每一條記錄包含一個(gè) 時(shí)間戳?和該時(shí)間點(diǎn)股票對應(yīng)的 價(jià)格?。

不巧的是,由于股票市場內(nèi)在的波動性,股票價(jià)格記錄可能不是按時(shí)間順序到來的。某些情況下,有的記錄可能是錯(cuò)的。如果兩個(gè)有相同時(shí)間戳的記錄出現(xiàn)在數(shù)據(jù)流中,前一條記錄視為錯(cuò)誤記錄,后出現(xiàn)的記錄 更正?前一條錯(cuò)誤的記錄。

請你設(shè)計(jì)一個(gè)算法,實(shí)現(xiàn):

更新 股票在某一時(shí)間戳的股票價(jià)格,如果有之前同一時(shí)間戳的價(jià)格,這一操作將?更正?之前的錯(cuò)誤價(jià)格。
找到當(dāng)前記錄里 最新股票價(jià)格?。最新股票價(jià)格?定義為時(shí)間戳最晚的股票價(jià)格。
找到當(dāng)前記錄里股票的 最高價(jià)格?。
找到當(dāng)前記錄里股票的 最低價(jià)格?。
請你實(shí)現(xiàn)?StockPrice?類:

  • StockPrice()?初始化對象,當(dāng)前無股票價(jià)格記錄。
  • void update(int timestamp, int price)?在時(shí)間點(diǎn) timestamp?更新股票價(jià)格為 price?。
  • int current()?返回股票 最新價(jià)格?。
  • int maximum()?返回股票 最高價(jià)格?。
  • int minimum()?返回股票 最低價(jià)格?。
示例 1:輸入: ["StockPrice", "update", "update", "current", "maximum", "update", "maximum", "update", "minimum"] [[], [1, 10], [2, 5], [], [], [1, 3], [], [4, 2], []] 輸出: [null, null, null, 5, 10, null, 5, null, 2]解釋: StockPrice stockPrice = new StockPrice(); stockPrice.update(1, 10); // 時(shí)間戳為 [1] ,對應(yīng)的股票價(jià)格為 [10] 。 stockPrice.update(2, 5); // 時(shí)間戳為 [1,2] ,對應(yīng)的股票價(jià)格為 [10,5] 。 stockPrice.current(); // 返回 5 ,最新時(shí)間戳為 2 ,對應(yīng)價(jià)格為 5 。 stockPrice.maximum(); // 返回 10 ,最高價(jià)格的時(shí)間戳為 1 ,價(jià)格為 10 。 stockPrice.update(1, 3); // 之前時(shí)間戳為 1 的價(jià)格錯(cuò)誤,價(jià)格更新為 3 。// 時(shí)間戳為 [1,2] ,對應(yīng)股票價(jià)格為 [3,5] 。 stockPrice.maximum(); // 返回 5 ,更正后最高價(jià)格為 5 。 stockPrice.update(4, 2); // 時(shí)間戳為 [1,2,4] ,對應(yīng)價(jià)格為 [3,5,2] 。 stockPrice.minimum(); // 返回 2 ,最低價(jià)格時(shí)間戳為 4 ,價(jià)格為 2 。

解題思路

  • void update(int timestamp, int price)?在時(shí)間點(diǎn) timestamp?更新股票價(jià)格為 price?。
  • int current()?返回股票 最新價(jià)格?。
  • int maximum()?返回股票 最高價(jià)格?。
  • int minimum()?返回股票 最低價(jià)格?。
    我們的目標(biāo)是實(shí)現(xiàn)上述4個(gè)方法。
  • int current()?返回股票 最新價(jià)格。我們只需要維護(hù)兩個(gè)變量,最大的時(shí)間戳以及對應(yīng)的價(jià)格即可
  • 而對于其他方法,我們需要讀取的是股票的最低以及最高價(jià)格,但是update方法會更正某些時(shí)間戳的價(jià)格,因此股票的最高和最低價(jià)格是動態(tài)更新的。使用一個(gè)treemap,維護(hù)價(jià)格和時(shí)間戳的對應(yīng)關(guān)系,對于某個(gè)價(jià)格,該股票可能有多個(gè)對應(yīng)的時(shí)間戳,利用treemap的特性我們可以在o(1)的時(shí)間復(fù)雜度內(nèi)獲取當(dāng)前最大和最小價(jià)格。我們可以使用map維護(hù)每個(gè)時(shí)間戳對應(yīng)的價(jià)格。
  • 而update方法就需要維護(hù)上面的兩個(gè)map。通過map,我們可以得到需要更新的時(shí)間戳原價(jià)是多少,再通過這個(gè)價(jià)格,定位到treemap里面,刪除該時(shí)間戳。然后再將該時(shí)間戳和價(jià)格的對應(yīng)關(guān)系插入到map和treemap里面
  • 代碼

    class StockPrice {//timeStamp ->priceMap<Integer, Integer> map = new HashMap<>();//price -> timeStampsTreeMap<Integer, Set<Integer>> up = new TreeMap<>();int curTime=-1,curPrice=-1;public StockPrice() {}public void update(int timestamp, int price) {if (timestamp>=curTime){curTime=timestamp;curPrice=price;}if(map.containsKey(timestamp)){Integer old = map.get(timestamp);up.get(old).remove(timestamp);if (up.get(old).isEmpty())up.remove(old);}map.put(timestamp, price);if (!up.containsKey(price))up.put(price,new HashSet<>());up.get(price).add(timestamp);}public int current() {return curPrice;}public int maximum() {return up.lastKey();}public int minimum() {return up.firstKey();}}/*** Your StockPrice object will be instantiated and called as such:* StockPrice obj = new StockPrice();* obj.update(timestamp,price);* int param_2 = obj.current();* int param_3 = obj.maximum();* int param_4 = obj.minimum();*/

    總結(jié)

    以上是生活随笔為你收集整理的5895. 获取单值网格的最小操作数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。