本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
396.旋转函数
题目大意
给定一个长度为 n 的整数数组 nums 。
假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:
F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]
返回 F(0), F(1), ..., F(n-1)中的最大值 。
生成的测试用例让答案符合 32 位 整数。
样例
示例 1:
输入: nums = [4,3,2,6]
输出: 26
解释:
F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26
所以 F(0), F(1), F(2), F(3) 中的最大值是 F(3) = 26 。
示例 2:
输入: nums = [100]
输出: 0
数据规模
提示:
n == nums.length-100 <= nums[i] <= 100
思路
记数组的元素之和为。根据公式,可以得到:
当 时,。可以不停迭代计算出不同的 ,并求出最大值。
typedef long long ll;
class Solution {
public:
int maxRotateFunction(vector<int>& nums) {
int n=nums.size();
vector<int>sum(n);
for (int i = 0; i < n; ++i)
{
if(i==0)sum[i]=nums[i];
else sum[i]=sum[i-1]+nums[i];
}
ll tot=0;
for(int i=0;i<n;i++){
tot=tot+i*nums[i];
}
ll ans=tot;
for(int i=n-1;i>=1;i--){
tot+=sum[n-1]-n*nums[i];
ans=max(ans,tot);
}
return ans;
}
};
题目
2034.股票价格波动
题目大意
给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
请你设计一个算法,实现:
- 更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
- 找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
- 找到当前记录里股票的 最高价格 。
- 找到当前记录里股票的 最低价格 。
请你实现 StockPrice 类:
StockPrice()初始化对象,当前无股票价格记录。void update(int timestamp, int price)在时间点timestamp更新股票价格为price。int current()返回股票 最新价格 。int maximum()返回股票 最高价格 。int minimum()返回股票 最低价格 。
样例
数据规模
思路
在中有两个关联容器,第一种是,内部是按照排序的,第二种是,容器内部是无序的,使用组织内容的。
考虑使用和。对于来讲,它默认以为关键字进行排序;对于来讲,它默认按储存的值进行从小到大的排序。
定义map<int,int>t来存储时间戳对应的股票价格 。如果要返回最新的股票价格,可以直接返回t.rbegin()->second。
定义multiset<int>p来存储所有的股票价格,它默认从小到大排序,所以最高价格为*p.begin(),最低价格为*p.rbegin()。注意在修改价格的时候,需要删除原来的价格,然后添加新的价格。
代码
class StockPrice {
public:
map<int,int>t;
multiset<int>p;
StockPrice() {
t.clear();
p.clear();
}
void update(int timestamp, int price) {
if(t.count(timestamp)){
p.erase(p.find(t[timestamp]));
}
p.insert(price);
t[timestamp]=price;
}
int current() {
return t.rbegin()->second;
}
int maximum() {
return *p.rbegin();
}
int minimum() {
return *p.begin();
}
};