396.旋转函数 & 2034.股票价格波动

161 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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
  • 1<=n<=1051 <= n <= 10^5
  • -100 <= nums[i] <= 100

思路

记数组numsnums的元素之和为sumsum。根据公式,可以得到:

F(0)=0×nums[0]+1×nums[1]++(n1)×nums[n1]F(0)=0×nums[0]+1×nums[1]+…+(n−1)×nums[n−1]

F(1)=1×nums[0]+2×nums[1]++(n1)×nums[n2]+(0)×nums[n1] =F(0)+sum[n1]nnums[n1]F(1)=1×nums[0]+2×nums[1]+…+(n−1)×nums[n−2]+(0)×nums[n−1]~ \\=F(0)+sum[n-1]-n*nums[n-1]

1k<n1 \le k \lt n时,F(k)=F(k1)+sum[n1]n×nums[nk]F(k) = F(k-1) + sum[n-1] - n \times \textit{nums}[n-k]。可以不停迭代计算出不同的 F(k)F(k),并求出最大值。

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() 返回股票 最低价格

样例

image-20220123163235460

数据规模

image-20220123163244353

思路

c++c++中有两个关联容器,第一种是mapmap,内部是按照keykey排序的,第二种是unordered_mapunordered\_map,容器内部是无序的,使用hashhash组织内容的。

考虑使用map<int,int>map<int,int>multiset<int>multiset<int>。对于map<int,int>map<int,int>来讲,它默认以keykey为关键字进行排序;对于multiste<int>multiste<int>来讲,它默认按储存的值进行从小到大的排序。

定义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();
    }
};