今天是我在图灵当助教老师上班的第一天,今天和孩子们一起参加了入门考试,自己尽管做对了,但用的时间太多,心态慌,遇题不够冷静,不能静下心来认真思索,究其原因还是临场经验不足,考试竞赛太少,在以后的日子里还需要多加学习,多加锻炼,多参加比赛,积累经验。
题目描述
这些日子乔治一直在研究股票,经过调研,他终于发现了某公司股票的规 律。更可喜的是,乔治能推算出这家公司每天的股价,为了防止别人发现他的 秘密,他决定对于这家公司的股票最多买入、卖出各一次。现在他已经将股票 价格列了出来,根据股票价格表,你能算出乔治的每股股票最多能赚多少钱吗?
输入
输入的第一行,一个正整数 n,表示天数; (n<=1e5)
第二行,用空格隔开的 n 个正整数,依次表示 n 天中每股股票的价格。
输出
输出只有一行,一个整数,表示每股最多赚多少钱。
样例输入
4
947 267 359 771
样例输出
504
题解代码:
#include<iostream>
#include<string>
using namespace std;
int n,a[1000005],dp[1000005],maxx=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dp[n]=a[n];
for(int i=n-1;i>=1;i--){
if(a[i]>dp[i+1]){
dp[i]=a[i];
}
else dp[i]=dp[i+1];
}
for(int i=1;i<n;i++){
if(a[i]<dp[i+1]){
maxx=max(maxx,dp[i+1]-a[i]);
}
}
printf("%d",maxx);
return 0;
}
题解思路:
首先,这道题要求算的是买入卖出的最大利润,可以想到,卖出一定是在买入之后,而且我们的最少盈利是0元(即当天买入,当天卖出的情况)
我们要求的便是在第i天之后的i+1到n-1天的最大值,且必须比第i天的值大。
具体做法是从0到n-1枚举每一个值并找到在第i个值i+1到n-1中最大的值且必须比a[i]大,若采用二重循环i从0到n-1,j从i+1到n-1得 枚举每一个元素从而找出每一个值后面最大的一个比该值大的值,时间复杂度为O(n^2),而此题n的值最大为100w,时间复杂度太高。
而如果我们换一个思路,第一步先建立一个dp数组,dp[i]的值表示i之后,即i+1到n-1最大的值;
第二步,for循环从0到n-1枚举每一个元素,求dp[i]-a[i](dp[i]必须大于a[i],若小于或等于,则直接continue跳入下一循环),
求出n次循环差的最大值即为答案,将时间复杂度从O(n^2)降到了O(2n)。
做题的时候性子不能急,耐心思考,细心钻研,才能得到准确优化,找到正确答案