leetcode2034.股票价格波动(中等,周赛)

在这里插入图片描述
在这里插入图片描述
需求分析:
●更新股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将正之前的错误价格。
----------对于这个需求,考虑用hash表。也就是unordered_map<时间戳,价格>
●找到当前记录里最新股票价格。最新股票价格定义为时间戳最晚的股票价格。
----------对于这个需求,可以定义一个变量来存最大的时间戳
●找到当前记录里股票的最高价格。
----------对于这个需求,有两种解法:
(1)用multiset存价格,并且删除价格的时候只能删除一个
(2)用map<价格,次数>,而不能用map<价格,时间戳>,因为价格可能会重复
●找到当前记录里股票的最低价格。
----------这个需求,解法同上。

解法一:用multiset

class StockPrice {
public:
	//放到构造函数的外面!!!
    int last_time = INT_MIN;
    unordered_map<int, int> mp;  
    multiset<int> s; //存价格 不能去重,且只能删除一个元素!!!
    StockPrice() {
    }
    void update(int timestamp, int price) {
        
        last_time = max(last_time, timestamp);
        if (mp.find(timestamp) == mp.end()) { //找不到 复杂度O(1)!!!
            mp[timestamp] = price;
            s.insert(price);
        } else { //能找到
            s.erase(s.lower_bound(mp[timestamp])); //或者s.erase(s.find(mp[timestamp]));!!!
            //s.erase(mp[timestamp]); 错误!!!
            mp[timestamp] = price;
            s.insert(price); 
        }
    }
    
    int current() {
        
        return mp[last_time];
    }
    
    int maximum() {

        return *s.rbegin();
    }
    
    int minimum() {
        
        return *s.begin();
    }
};

易错点:
1:复杂的数据结构不能放在构造函数里面
2:●更新股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将正之前的错误价格。对于这个需求:先考虑hash而不是map,因为不排序复杂度更高。
3:set存价格的话,不能去重,因为价格可能相同,所以只能用multiset而不能用set!!!同时,删除的时候只能删除一个元素,而不能把相同的所有元素都删掉!!!

auto tmp= s.lower_bound(mp[timestamp]);
s.erase(tmp);
//而不是s.erase(mp[timestamp]);

解法二:用map<价格,次数>

class StockPrice {
public:

    unordered_map<int, int> timePrice; 
    int lasttime = INT_MIN;
    map<int, int> priceTimes; //价格 对 次数
    StockPrice() {

    }
    
    void update(int timestamp, int price) {
    
        lasttime = max(lasttime, timestamp);
        if (timePrice.find(timestamp) == timePrice.end()) { //没出现
            timePrice[timestamp] = price;
            priceTimes[price]++;
        }else { //出现过
            int old = timePrice[timestamp];
            priceTimes[old]--;
            if (!priceTimes[old]) {
                priceTimes.erase(old);
            }
            timePrice[timestamp] = price;
            priceTimes[price]++;
        }
    }
    
    int current() {

        return timePrice[lasttime];
    }
    
    int maximum() {
        
        return priceTimes.rbegin()->first;
    }
    
    int minimum() {

        return priceTimes.begin()->first;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值