121.Best Time to Buy and Sell Stock

     这道题的本质是求连续最大子区间问题,将数组中的每个元素转换为与前一位的差,那么最大的子区间就是收益最高的区间。
    在求最大子区间时,可以想到,如果将区间分为两部分,那么最大子区间可能是左边区间的子区间,右边区间的子区间,也可能跨越中点的区间。对于左右子区间,可以很容易转化为递归步,所以只需要计算跨越中点的最大区间,这个很简单:从中点开始往左往右加,若更大,则更新区间端点,否则继续加。

intfind_max_subarray(vector<int>& a, int low, int high)

{

if (low == high)

{     if(a[low] < 0)

               return 0;

        else

               return a[low];}

else

{

        int mid = (low + high) / 2;

        int left_max = find_max_subarray(a, low,mid);

        int right_max = find_max_subarray(a,mid+1, high);

        int sum = 0, left = mid, t1 = a[mid];

        for (int i = left; i >= low; i--)

        {

               sum += a[i];

               if (sum > t1)

               {

                      t1 = sum;

                      left = i;

               }

        }

        int right = mid + 1, t2 = a[right];

        sum = 0;

        for (int i = right; i <= high; i++)

        {

               sum += a[i];

               if (sum > t2)

               {

                      t2 = sum;

                      right= i;

               }

        }

        int cross_max = t1 + t2;

        if (left_max < 0 && right_max< 0 && cross_max < 0)

               return 0;

        if (left_max >=cross_max&&left_max >= right_max)

               return left_max;

        else if (right_max >= cross_max)

               return right_max;

        else

               return cross_max;

}

 

 

}

classSolution {

public:

    int maxProfit(vector<int>&prices) {

        int n = prices.size();

if (n<2)

        return 0;

for (int i = n - 1; i > 0; --i)

        prices[i] -= prices[i - 1];

return find_max_subarray(prices, 1, n - 1);

    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值