列表

详情


DP31. 买卖股票的最好时机(二)

描述

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费

数据范围:
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度

输入描述

第一行输入一个正整数 n ,表示数组 prices 的长度
第二行输入 n 个正整数,表示数组中prices的值

输出描述

输出最大收益

示例1

输入:

7
8 9 2 5 4 7 1

输出:

7

说明:

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
总获利1+3+3=7,返回7     

示例2

输入:

5
5 4 3 2 1

输出:

0

说明:

由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。         

示例3

输入:

5
1 2 3 4 5

输出:

4

说明:

第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。             

原站题解

Rust 解法, 执行用时: 8ms, 内存消耗: 2228KB, 提交时间: 2022-04-01

use std::io;

fn main() {
    let mut n = String::new();
    io::stdin().read_line(&mut n).expect("Failure");
    let n:i32 = n.trim().parse().expect("Failure");
    
    let mut prices = String::new();
    std::io::stdin().read_line(&mut prices).unwrap();
    let prices = prices.trim()
                .split_whitespace()
                .map(|s| s.parse::<i32>().unwrap())
                .collect::<Vec<i32>>();
    println!("{}", max_profit(prices));
}

fn max_profit(prices: Vec<i32>) -> i32 {
    let n  = prices.len();
    if n < 2 {
        return 0i32;
    }
    let mut dp = vec![[0;2]; n];
    
    for i in 0..n {
        if i == 0 {
            dp[i][1] = -prices[i]
        } else {
            dp[i][0] = dp[i-1][0].max(dp[i-1][1] + prices[i]);
            dp[i][1] = dp[i-1][1].max(dp[i-1][0] - prices[i]);
        }
    }
    
    dp[n-1][0]
}

C 解法, 执行用时: 13ms, 内存消耗: 672KB, 提交时间: 2022-03-12

#include <stdio.h>
#include <string.h>

int max(int a,int b){
	return a>b?a:b;
}
int main(){
	int n,m=0;
	scanf("%d",&n);
	int a[n];
	int dp[n];
	int i,j=0;
	for(i=0;i<n;i++){
		scanf("%d",a+i);
	}
	dp[0] =0;
	for(i=1;i<n;i++){
		dp[i]=max(0,a[i]-a[i-1]);
		j  += dp[i];
	}
	printf("%d\n",j);

	return 0;
}

C++ 解法, 执行用时: 13ms, 内存消耗: 792KB, 提交时间: 2022-03-26

#include"iostream"
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n,prices[100005],res = 0;
    cin>>n;
    for(int i=0;i<n;i++) cin>>prices[i];
    for(int i=1;i<n;i++)
    {
        if(prices[i]>prices[i-1]) res+=prices[i]-prices[i-1];
    }
    cout<<res;
    return 0;
}

C++ 解法, 执行用时: 13ms, 内存消耗: 1740KB, 提交时间: 2022-03-03

#include<iostream>
#include<algorithm>
using namespace std;
int price[100000],dp[100000] = {0};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 0;i < n;++i)
        cin >> price[i];
    for(int i = 1;i < n;++i){ 
        int sum = price[i] - price[i - 1];
        if(sum > 0)
            dp[i] = dp[i - 1] + sum;
        else
            dp[i] = dp[i - 1];
    }
    cout << dp[n - 1];
}

Go 解法, 执行用时: 13ms, 内存消耗: 6396KB, 提交时间: 2022-03-06

package main

import (
    "bufio"
    "os"
    "strings"
    "strconv"
    "fmt"
)


func main(){
    br:=bufio.NewReader(os.Stdin)
    str,_:=br.ReadString('\n')
    str=strings.ReplaceAll(str,"\n","")
    N,_:=strconv.Atoi(str)
    arr:=make([]int,N)
    str,_=br.ReadString('\n')
    str=strings.ReplaceAll(str,"\n","")
    strArr:=strings.Split(str," ")
    for i:=range arr{
        arr[i],_=strconv.Atoi(strArr[i])
    }
    fmt.Println(solutionV1(arr))
    
}

func solutionV1(arr []int)int{
    ans:=0
    for i:=1;i<len(arr);i++{
        if arr[i]<=arr[i-1]{
            continue
        }
        ans+=arr[i]-arr[i-1]
    }
    return ans
}


func min(a,b int)int{
    if a<b{
        return a 
    }
    return b 
}

func max(a,b int)int{
    if a>b{
        return a 
    }
    return b 
}

上一题