一个数组上的两个极值的协调交互优化问题(C++)

问题:

在这里插入图片描述

暴力法:

好家伙。。。不出所料,超时了

#include<algorithm>
class Solution {
public:
    int maxProfit(vector<int>& prices) {
    int result=0;
    for (int i = prices.size()-1; i>0; i--){
        for (int j=i-1; j>=0; j--)
        if(prices[i]>prices[j]){
            result=max(prices[i]-prices[j],result);
        }
    }
    return result;
    }
};

双temp:

思考一下这是一个最优解的问题,修改了几轮想出了以下思路:

  • 设定从左向右的寻找顺序
  • 设定tempMin tempMax存储当前的极值
  • ①当遇到比tempMin小的值时,此时更新tempMin,tempMax置为tempMin(因为题目的限定是极大值必然出现在极小值之后,因此之前的要清零,但清零时要注意的是之前的值也要保存)
  • ②当遇到比tempMax大的值时,更新tempMax 和result
  • 需要注意的是,如果过程①中tempMax置为INT_MIN,那么过程①②的顺序不能颠倒!!!因为这样以后,如果先进行②的判断那么必然成立!!!
  • 经过个人经验,对数组的大小类操作,不如将temp都设置为初始值或者初始相邻值。
#include<algorithm>
#include<vector>
#include<limits>
class Solution {
public:
    int maxProfit(vector<int>& prices) {
    int pricesNum(prices.size());
    int tempMin(prices[0]),tempMax(prices[0]);
    int result(0);

    for (int i=1; i<pricesNum; i++){

        if (tempMin > prices[i] ){
            tempMin = prices[i];
            //tempMax = INT_MIN;//这样以后else if如果在前面则必然执行
            tempMax = tempMin;
            
        }
        else if (tempMax < prices[i]){
            tempMax = prices[i];
            result = max(tempMax-tempMin,result);
        }
    }
    return result;
    }

};

官方方法:一次遍历

抓住了核心要点,最低点买入是最好的,最低点动态变化,在变化之前拿当前利益与历史最大利益比较,和我的双temp大同小异,但是执行时间的占用内存都略逊于我的方法:
在这里插入图片描述自己设置了一个inf倒是 - - 省下INT_MIN/MAX了

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int inf = 1e9;
        int minprice = inf, maxprofit = 0;
        for (int price: prices) {
            maxprofit = max(maxprofit, price - minprice);
            minprice = min(price, minprice);
        }
        return maxprofit;
    }
};
作者:LeetCode-Solution
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值