贪心(入门)-LeetCode-股票买卖 II

贪心(入门)-acwing-1055. 股票买卖 II

题目:
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

输入格式
第一行包含整数 N,表示数组长度。

第二行包含 N 个不大于 10000 的正整数,表示完整的数组。

输出格式
输出一个整数,表示最大利润。

数据范围
1≤N≤105
输入样例1:
6
7 1 5 3 6 4
输出样例1:
7
输入样例2:
5
1 2 3 4 5
输出样例2:
4
输入样例3:
5
7 6 4 3 1
输出样例3:
0
样例解释
样例1:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。共得利润 4+3 = 7。

样例2:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

样例3:在这种情况下, 不进行任何交易, 所以最大利润为 0。

题解:

目 光 短 浅 , 贪 婪 , 遇 涨 则 卖 : 目光短浅,贪婪,遇涨则卖:

设 第 i 天 股 票 的 价 格 p r i c e i , 那 么 对 于 第 j ( j > i ) 天 卖 出 第 i 天 购 进 的 股 票 获 得 的 利 润 为 p r i c e j − p r i c e i 。 设第i天股票的价格price_i,那么对于第j(j>i)天卖出第i天购进的股票获得的利润为price_j-price_i。 ipricei,j(j>i)ipricejpricei

p r i c e j − p r i c e i = p r i c e j − p r i c e j − 1 + p r i c e j − 1 − p r i c e j − 2 + p r i c e j − 2 − . . . − p r i c e i + 1 + p r i c e i + 1 − p r e i c e i 。 price_j-price_i=price_j-price_{j-1}+price_{j-1}-price_{j-2}+price_{j-2}-...-price_{i+1}+price_{i+1}-preice_i。 pricejpricei=pricejpricej1+pricej1pricej2+pricej2...pricei+1+pricei+1preicei

也 就 是 说 : 在 第 i 天 买 入 , 第 j 天 卖 出 , 相 当 于 当 天 买 隔 天 卖 出 即 第 i 天 买 入 , 第 i + 1 天 卖 出 . . . 直 到 第 j 天 卖 出 。 也就是说:在第i天买入,第j天卖出,相当于当天买隔天卖出即第i天买入,第i+1天卖出...直到第j天卖出。 i,j,i,i+1...j

那 么 对 于 N 天 股 票 , 只 要 当 天 比 前 一 天 价 格 高 就 进 行 买 卖 交 易 , 最 大 值 即 所 有 相 邻 价 格 差 大 于 0 利 润 和 。 那么对于N天股票,只要当天比前一天价格高就进行买卖交易,最大值即所有相邻价格差大于0利润和。 N,,0

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 0x7fffffff
using namespace std;
const int N=1e5+10;
int price[N];
int n;
ll ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d",&price[i]);

    for(int i=2;i<=n;i++)
        if(price[i]>price[i-1])
            ans+=(price[i]-price[i-1]);

    printf("%lld\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值