列表

详情


DP30. 买卖股票的最好时机(一)

描述

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费

数据范围:

输入描述

第一行输入一个正整数 n 表示数组的长度
第二行输入 n 个正整数,表示股票在第 i 天的价格

输出描述

输出只买卖一次的最高收益

示例1

输入:

7
8 9 2 5 4 7 1

输出:

5

说明:

在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。          

示例2

输入:

3
2 4 1

输出:

2

示例3

输入:

3
3 2 1

输出:

0

原站题解

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

#include<iostream>
using namespace std;
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
	int Max = 0,n,arr,In;
	cin >> n>>In;
	for (int i = 1; i < n; i++) {
        cin>>arr;
		In = min(In, arr);
		Max = max(Max,arr-In);
	}
	cout << Max << endl;

	return 0;
}

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

#include<iostream>
using namespace std;
const int MAXN = 1e5+5;
int n, val;

int main(){
    ios::sync_with_stdio(false);
    cin >> n;
    int ans = 0, mmin = 0x7fffffff;
    while(n--){
        cin >> val;
        mmin = min(mmin, val);
        ans = max(val - mmin, ans);
    }
    cout << ans;
    
    
    return 0;
}

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

#include<iostream>
using namespace std;
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
	int Max = 0,n,arr,In;
	cin >> n>>In;
	for (int i = 1; i < n; i++) {
        cin>>arr;
		In = min(In, arr);//最小数
		Max = max(Max,arr-In);//最大值
	}
	cout << Max << endl;

	return 0;
}

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

// #include <iostream>
// #include <vector>

// using namespace std;

// int main(){
//     int n;
//     cin>>n;
//     vector<int> num(n);
//     for(int i=0;i<n;i++) cin>>num[i];
    
//     vector<vector<int>> dp(n,vector<int>(2,0));
//     dp[0][0]=0;dp[0][1]=-num[0];//0不持有
//     for(int i=1;i<n;i++){
//         dp[i][0]=max(dp[i-1][1]+num[i],dp[i-1][0]);
//         dp[i][1]=max(dp[i-1][1],-num[i]);
//     }
//     cout<<dp[n-1][0];
// //暴力
// //     vector<int> dp(n,0);//第i天卖出的收益
// //     int res=0;
// //     for(int i=1;i<n;i++){
// //         for(int j=0;j<i;j++){
// //             dp[i]=max(dp[i],num[i]-num[j]);
// //         }
// //         res=max(res,dp[i]);
// //     }
// //     cout<<res;
//     return 0;
// }
#include<iostream>
using namespace std;
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
	int Max = 0,n,arr,In;
	cin >> n>>In;
	for (int i = 1; i < n; i++) {
        cin>>arr;
		In = min(In, arr);
		Max = max(Max,arr-In);
	}
	cout << Max << endl;

	return 0;
}

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

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int MAXN=100000;
int price[MAXN];

int DP(int n){
    int diff=0;
    int place=0;
    for(int i=1;i<n;++i){
        if(price[i]-price[place]<=0){
            place=i;
        }else{
            diff=max(diff,price[i]-price[place]);}
        //printf("i=%d diff=%d \n",i,diff);
    }
    return diff;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&price[i]);
    }
    int result=DP(n);
    printf("%d",result);
    return 0;
}

上一题