zoukankan      html  css  js  c++  java
  • [leetcode]Best Time to Buy and Sell Stock III

    - -最多可以买两次。。。最大收益。。。

    第一想法,枚举分割线,然后按I那种做法来做,算两边的最大收益。

    = =时间复杂度O(n^2)

    其实可以这么想啦..

    从刚才的枚举分割线的想法,那么我就用两个数组记录

    从左到右的最大收益,另外一个是从右往左的最大收益.

    那么还是枚举分割线哒!但是实践复杂度就是O(n)啦.

    class Solution {
    public:
        void calc(vector<int>&data , vector<int>&f){
            int minx = 0;
            int ans = 0;
            f[0] = 0;
            for(int i = 1 ; i < data.size() ; i++){
                if(data[i] < data[minx]) minx = i;
                int tmp = data[i] - data[minx];
                ans = max (ans , tmp);
                f[i] = ans;
            }
        }
        void calc1(vector<int>&data , vector<int>&f){
            int maxx = 0;
            int ans = 0;
            f[0] = 0;
            for(int i = 1 ; i < data.size() ; i++){
                if(data[i] > data[maxx]) maxx = i;
                int tmp = data[maxx] - data[i];
                ans = max(ans , tmp);
                f[i] = ans;
            }
        }
        int maxProfit(vector<int> &prices) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(prices.size() <= 1) return 0;
            vector<int> f(prices.size());
            vector<int> h(prices.size());
            calc(prices , f);
            reverse(prices.begin() , prices.end());
            calc1(prices , h);
            reverse(h.begin() , h.end());
            int ans = f[f.size() - 1];
            
            for(int i = 0 ; i < f.size() - 1 ; i ++){
                ans = max(ans , f[i] + h[i+1]);
            }
            return ans;
            
        }
    };
    

      

  • 相关阅读:
    mysql 8安装
    MYSQL escape用法--转义
    为什么lombok不起作用
    zookeeper的作用
    限流的玩法汇总
    Golang程序调试工具介绍(gdb vs dlv)
    净化Git之rebase变基的使用
    深入linux下磁盘Disk,分区Partition,挂载Mount
    利用SSH(无密码)免登录来节省你的生命
    tcp_tw_reuse、tcp_tw_recycle注意事项
  • 原文地址:https://www.cnblogs.com/x1957/p/3282471.html
Copyright © 2011-2022 走看看