力扣262周赛-2034

第八十天 --- 力扣262周赛-2034

题目一

力扣:2034

在这里插入图片描述
在这里插入图片描述

思路

注:更多c++STL库常用容器,见C++ STL常用容器API总结
1、本题思路很简单,直接按照题目模拟就行,但是关键就在于数据量巨大,需要用良好的数据结构封装已知的数据,才能在接下来的查询中,用最快的速度完成,要不然必定会超时,博主也是吃了没文化的亏,没想到对应的数据结构。
2、当出现了要快速的添加、查找、删除,并且不要求内部有顺序的时候,就用unordered_map/unordered_set。但是以上这两个东西内部不可以重复,一旦想重复,就用unordered_multimap/unordered_multiset,带unordered前缀的,内部都是杂乱无章的,并没有顺序。
3、当出现了对顺序的需求的时候,即要求内部按照严格的顺序排列,方便迭代出来的东西严格递增的时候,用set/map,这二者不能够有重复元素,如果想要有重复元素,就用multimap和multiset
4、
set更偏向于只存值,让你知道他在里面,用迭代器可以全部取出来。
map更偏向于一个字典,手动定义一个键值对存储在内,所以按照不同需求使用二者。
5、本题主体就是两件事:
<1> 维护最新的日期,用最快的速度找与之对应的价格,所以做一个map存储日期-价格,因为不要求顺序,只要最快的速度找到key对应的value,所以unordered_map
<2> 维护最高价格和最低价格,因为本体用极大的数据测试,所以常规O(N)办法肯定不行,因为一旦新来的时间戳在更新数据时候把最大值更掉了,在一堆新的值里面重新找最大值,常规的数据结构很复杂,时间复杂度太高,所以要最快速的找,就要用一种本身一直能够维护一个递增的数据结构,而且速度够快。
<3> 所以用了set(因为只想看价格,不类似于字典),其内部红黑树,各种操作均稳定在O(lgN),因为有重复元素,所以用multiset,它内部自动的为我们维护一个递增的序列,每次只需要向里面插数据或者删数据即可。

代码

注意:
1、multiset在使用erase方法的时候,如果直接erase一个数,则会删除所有

multiset<int,greater<int>>::iterator ite = price_set.find(item);
price_set.erase(ite);//删除一个
price_set.erase(item);//删除所有

2、
price_set.begin() 正向迭代器第一个,最小值
price_set.rbegin()逆向迭代器第一个,最大值
二者返回的都是地址,前面加*才是内部值。

class StockPrice {
    
    
public:
	StockPrice() {
    
    
		newest_stamp = 0;
	}

	void update(int timestamp, int price) {
    
    
		if (!stamp_price_map.count(timestamp)) {
    
    //之前没出现过
			stamp.push_back(timestamp);
		}
		else {
    
    
			int tmp = stamp_price_map[timestamp];//删除原本的价格
			multiset<int, greater<int>>::iterator ite = price_set.find(tmp);//利用迭代器只删除一个
			price_set.erase(ite);//直接erase则会删除多个
		}
		price_set.insert(price);//插入新价格
		newest_stamp = max(newest_stamp, timestamp);//更新最新日期
		stamp_price_map[timestamp] = price;//插入或修改
	}

	int current() {
    
    
		return stamp_price_map[newest_stamp];
	}

	int maximum() {
    
    
		return *price_set.rbegin();//逆序迭代器第一个
	}

	int minimum() {
    
    
		return *price_set.begin();//正序迭代器第一个
	}

private:
	int newest_stamp;//动态维护最新日期
	vector<int> stamp;
	unordered_map<int, int> stamp_price_map;
	multiset<int> price_set;//允许相同元素,内部严格从小到大排序
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45678698/article/details/120711184