题解 | #买卖股票的最好时机(二)#

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

https://www.nowcoder.com/practice/9e5e3c2603064829b0a0bbfca10594e9

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算最大收益
     * @param prices int整型vector 股票每一天的价格
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        // write code here
        // 通过观察示例,发现一种思路 只要是递增的部分, 从头部那天买入 局部极大值卖出 可以作为一次收益
        // 想起双指针 我先写了三指针的 但差一个样例 但又不能直接debug为何错误
        // 看了官解二 我之前还是没想到最后最简单的版本

        int n = prices.size();
        if(n<2)
        {
            return 0;
        }
        int ans = 0;
        for(int i=1; i<n; ++i)
        {
            if(prices[i] > prices[i-1])
            {
                ans += prices[i] - prices[i-1];
            }
        }
        
        return ans;

    }
};


class Solutionmy {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算最大收益
     * @param prices int整型vector 股票每一天的价格
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        // write code here
        // 通过观察示例,发现一种思路 只要是递增的部分, 从头部那天买入 局部极大值卖出 可以作为一次收益
        // 想起双指针

        int n = prices.size();
        if(n<2)
        {
            return 0;
        }
        else if(n==2)
        {
            if(prices[0]>=prices[1])
            {
                return 0;
            }
            else
            {
                return prices[1]-prices[0];
            }
        }

        int left=0, mid = 1, right = 2;
        int ans = 0;
        while(right<n)
        {
            while(prices[left]<=prices[mid] && prices[mid]<=prices[right] && right<n)
            {
                mid++;
                right++;
            }

            // 若不是递增 就分情况讨论
            if(prices[mid]>prices[right] && prices[left]<=prices[mid] && right<n)
            {
                // 可以执行一轮计算
                ans += (prices[mid] - prices[left]);
                left = right; //left +=2;
                mid = left +1; //mid += 2;
                right = mid+1; //right += 2;
                continue;
            }
            else if(prices[left] > prices[mid] && right<n)
            {
                left++;
                mid++;
                right++;
            }
            else if(right>=n)
            {
                ans += (prices[mid] - prices[left]);
                break;
            }
        }

        return ans;

    }
};

我的在下面 有一个样例没通过

全部评论

相关推荐

2024-12-20 21:43
湖北大学 Java
黑皮白袜臭脚体育生:项目加一个毛遂自荐一下,开源仿b站微服务项目,GitHub已经390star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
2024-12-29 15:37
已编辑
西华大学 图像识别
程序员牛肉:去不了,大厂算法卡学历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务