leetcode 121. Best Time to Buy and Sell Stock

发布于 2022-09-03 13:25:50 字数 1922 浏览 10 评论 0

https://leetcode.com/problems...

我是看了算法导论里面,将这个问题转化成求一个数组最小子数组和的问题,下面是我的代码。我在xcode里面跑是对的,然后在leetcode上面,相同的输入,死活出现错误结果。

Your input

[7,1,5,3,6,4]
Your answer

33
Expected answer

5

这组输入,我在ide里面是对的,在leetcode的测试里面是错的,求解

class Solution {
public:
    int maxProfit(vector<int>& prices) {
    //将prices数组转化为代表每日价格变化的数组
    //为了能保证in-place,需要从后面向前面转换
        if (prices.empty())
            return 0;
        for(int i=prices.size()-1;i>0;i--){
            prices[i]=prices[i-1]-prices[i];
            prices[i]*=-1;
        }
        prices[0]=0;
        return findMaxSumSubarray(prices,0,prices.size());
    }
private:
    //返回跨越中点的最大子数组之和
    int findMaxSumCrossSubarray(vector<int> prices, int low,int high){
        int mid=(low+high)/2;
        int rightMaxSum=0;
        int tempSum=0;
        for(int i=mid+1;i<high;i++){
            tempSum+=prices[i];
            rightMaxSum=max(rightMaxSum,tempSum);
        }
        int leftMaxSum=0;
        tempSum=0;
        for(int i=mid-1;i>=low;i--){
            tempSum+=prices[i];
            leftMaxSum=max(leftMaxSum,tempSum);
        }
        return (leftMaxSum+rightMaxSum+prices[mid]);
    }
    //返回prices数组中的最大子数组之和
    int findMaxSumSubarray(vector<int> prices, int low,int high){
        if(low==high)
            return prices[low];
        int mid=(low+high)/2;
        int leftSum=findMaxSumSubarray(prices,low,mid);
        int rightSum=findMaxSumSubarray(prices,mid+1,high);
        int midSum=findMaxSumCrossSubarray(prices,low,high);
        if(leftSum>=rightSum&&leftSum>=midSum)
            return leftSum;
        else if(rightSum>=leftSum&&rightSum>=midSum)
            return rightSum;
        else return midSum;
    }
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝礼 2022-09-10 13:25:50

题主下次记得把主函数什么的也都贴上来……

注意到楼上的截图,对于同一个输入会有不同的输出,所以猜测是访问溢出

又看到到递归的时候,分别使用了low,midmid+1,high作为参数传递,所以知道对于findMaxSumSubarray(prices,low,high),其考察的是[low,high]范围内的数据

然而题主又在一开始的地方写了findMaxSumSubarray(prices,0,prices.size());

是不是应该改成findMaxSumSubarray(prices,0,prices.size()-1);呢~

唠甜嗑 2022-09-10 13:25:50

你这做的也太复杂了吧。。我的题解 https://github.com/hanzichi/l...

战皆罪 2022-09-10 13:25:50

clipboard.png

clipboard.png

我多编译运行几次,发现答案不一致。应该是题主你的算法存在问题,题主再思考一下吧。这道题目代码写不到这么复杂,题主可以再思考一下。我就不给你检查代码了。。。太长了,这些算法题,多刷刷,做完一道再去看看别人的代码,学习一下别人的代码,可能更有收获。leetcode那里面的讨论区,你可以逛逛哦。题主,你懂的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文