84/121/309/1

84.柱状图中的最大矩形面积

找到左边和右边的较小值,说明以栈顶值为底的时候,不能扩展到这两个位置;

数组头尾都加入0,使能够头尾元素可以作为底来计算。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        //寻找以栈顶元素为底的左右的第一个较小数值,
        //单调递减栈
        int result = 0;
        stack<int> st;
        heights.insert(heights.begin(),0);//数组头部插入0
        heights.push_back(0);
        st.push(0);//将第一个数字推入栈中

        //从下标1开始
        for(int i=1;i<heights.size();i++){
            if(heights[i]>heights[st.top()]){
                st.push(i);
            }else if(heights[i] == heights[st.top()]){
                st.pop();//只记录一个底,可以不加
                st.push(i);
            }else{
                while(!st.empty()&&heights[i]<heights[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        //不为空时,操作;空时直接插入
                        int left = st.top();
                        int right = i;
                        int w=right-left-1;
                        int h = heights[mid];
                        result = max(result,w*h);
                    }
                }
                st.push(i);
            }
        }
        return result;
    }
};

121.买卖股票的最佳时机

1.动态规划

//只有一次买卖操作

//持有股票状态1.当日买入股票2.保持前几天买入股票的状态 (肯定是选取花钱最少的状态)

//卖出股票状态1.当日不卖股票,也就是维持前一天的状态2.当日卖掉股票,更新获得的钱(肯定是选取卖掉股票利润最高的,如果之前的操作不高,那么就更替为今天的卖出状态)

dp[i][0]表示第i天持有股票所得最多现金,

dp[i][1]表示第i天不持有股票最多现金,

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //只有一次买卖操作
        //持有股票状态1.当日买入股票2.保持前几天买入股票的状态 (肯定是选取花钱最少的状态)
        //卖出股票状态1.当日不卖股票,也就是维持前一天的状态2.当日卖掉股票,更新获得的钱(肯定是选取卖掉股票利润最高的,如果之前的操作不高,那么就更替为今天的卖出状态)
        //初始化,
        int len =prices.size();
        /*
        vector<vector<int>> dp(len,vector<int>(2));//开辟数组
        dp[0][0]-=prices[0];
        dp[0][1]=0;
        for(int i =1;i<len;i++)
        {
            dp[i][0] = max(dp[i-1][0],-prices[i]);//买入股票的操作
            dp[i][1] = max(dp[i-1][1],prices[i]+dp[i-1][0]);//卖出股票的操作
        }
        return dp[(len-1)][1];*/
        vector<vector<int>> dp(2, vector<int>(2)); // 注意这里只开辟了一个2 * 2大小的二维数组
        dp[0][0] -= prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            dp[i % 2][0] = max(dp[(i - 1) % 2][0], -prices[i]);
            dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);
        }
        return dp[(len - 1) % 2][1];
    }
};

2.贪心算法:取最左最小值,去最有最大值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int low = INT_MAX;
        int result = 0;
        for(int i= 0;i<prices.size();i++){
            low = min(low,prices[i]);//更新最小值
            result = max(result,prices[i]-low);//直接取最大区间利润
        }
        return result;
    }   
};

309.最佳买卖股票时期含冷冻期

dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。

四个状态:

状态一;1.持有股票状态,可以是今天买入,或者是之前就买入了股票后后面没有操作,一直持有。

2.不持有股票状态有两种:

状态三;第一种为今天卖出股票

状态二;第二种为今天不卖出,保持卖出的状态(两天前就卖出了股票,度过了一天的冷冻期;或者前一天就是卖出股票状态,一直没有操作)

状态四;3.今天为冷冻期,但冷冻状态不可持续,只有一天

买入股票状态dp[i][0]:

保持前面的买入状态 dp[i-1][0];

今天买入1.前一天是冷冻期,dp[i-1][3]-prices[i]

                2.冷冻期以后的保持卖出状态,dp[i-1][1]-prices[i]

那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);

保持卖出股票状态dp[i][1]:

状态二+状态四

dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);

今天就卖出股票状态dp[i][2]:

昨天一定是持有股票状态:dp[i][2] = dp[i - 1][0] + prices[i];

冷冻期状态dp[i-1][3]:

昨天卖出了股票,dp[i][3] = dp[i - 1][2];

初始化dp[0][0]=-prices[0];

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n==0) return 0;
        vector<vector<int>> dp(n,vector<int>(4,0));
        dp[0][0]-=prices[0];
        for(int i=1;i<n;i++){
            dp[i][0] = max(dp[i-1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i];
            dp[i][3] = dp[i - 1][2];
        }
        return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    }
    
};

1.两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        //使用map映射 数字和下标
        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++){
            //遍历当前元素,并且在map中查看是否有匹配的value
            auto iter = map.find(target-nums[i]);
            //找到说明有匹配值
            if(iter!=map.end()){
                return {iter->second,i};
            }
            //没找到则加入当前值及下标
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="800.000000pt" height="106.000000pt" viewBox="0 0 800.000000 106.000000" preserveAspectRatio="xMidYMid meet"> <g transform="translate(0.000000,106.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M2220 932 l0 -131 38 -6 c115 -18 198 -53 243 -101 l22 -24 27 68 c26 66 72 144 113 190 20 22 20 22 1 38 -64 52 -175 82 -336 91 l-108 6 0 -131z"/> <path d="M6673 1040 c-64 -39 -87 -106 -58 -171 44 -97 180 -107 235 -16 71 116 -63 257 -177 187z"/> <path d="M0 930 l0 -120 510 0 510 0 0 120 0 120 -510 0 -510 0 0 -120z"/> <path d="M1140 1045 c-1 -3 -1 -56 -1 -117 l0 -113 351 -5 352 -5 24 -28 c32 -37 32 -86 0 -116 -23 -21 -27 -22 -375 -24 l-353 -2 0 -110 0 -110 362 -5 362 -5 19 -24 c27 -33 25 -86 -6 -116 l-24 -25 -354 0 c-194 0 -356 -2 -358 -4 -2 -2 -3 -54 -1 -115 l3 -111 338 0 c367 0 412 5 501 57 62 37 138 110 163 158 16 29 21 59 22 110 0 76 -16 119 -61 168 l-26 28 20 22 c32 35 60 100 68 154 14 112 -56 230 -169 286 -106 52 -152 57 -519 57 -186 0 -338 -2 -338 -5z"/> <path d="M3031 1034 c-176 -38 -309 -143 -386 -306 -24 -51 -55 -132 -69 -180 -31 -106 -55 -155 -98 -198 -45 -45 -106 -70 -188 -77 l-70 -6 0 -133 0 -134 84 0 c172 0 321 48 399 128 l39 40 36 -40 c68 -76 179 -113 365 -125 l107 -6 0 135 0 136 -57 7 c-222 28 -330 177 -254 350 39 87 125 142 240 153 l66 7 3 133 3 132 -78 -1 c-43 0 -107 -7 -142 -15z"/> <path d="M3430 985 l0 -45 560 0 560 0 0 -93 c0 -59 -5 -99 -12 -110 -12 -16 -47 -17 -438 -15 l-425 3 0 35 0 35 388 3 387 2 0 40 0 40 -510 0 -510 0 0 -79 c0 -97 10 -125 52 -151 32 -19 51 -20 616 -20 644 0 629 -1 667 63 17 27 20 56 23 185 l4 152 -681 0 -681 0 0 -45z"/> <path d="M4994 1016 c-3 -8 -4 -27 -2 -43 l3 -28 276 -5 276 -5 -18 -42 -18 -43 -250 0 -250 0 -3 -211 c-2 -116 -1 -213 1 -215 2 -2 229 -4 503 -4 l498 0 0 50 0 50 -380 0 -381 0 3 118 3 117 423 0 423 0 -1 -310 c0 -271 -3 -311 -17 -327 -15 -17 -44 -18 -413 -18 -352 0 -399 2 -411 16 -9 12 -12 46 -10 125 l2 109 -125 0 -126 0 0 -122 c0 -143 13 -182 70 -211 32 -16 78 -17 613 -15 l579 3 34 37 c34 38 34 38 34 136 0 54 3 228 7 385 l6 287 -291 0 c-318 0 -303 -3 -281 58 l11 31 270 3 270 3 24 28 c52 60 88 57 -661 57 -582 0 -686 -2 -691 -14z"/> <path d="M6980 976 c0 -51 27 -66 119 -66 l74 0 -6 -67 c-4 -38 -7 -94 -7 -125 l0 -58 -84 0 c-101 0 -136 -19 -136 -76 l0 -34 109 0 109 0 -5 -200 -6 -200 126 0 127 0 0 78 c0 44 3 134 7 200 l6 122 82 0 c100 0 135 19 135 76 l0 34 -111 0 -112 0 6 83 c4 45 7 101 7 125 l0 42 141 0 140 0 -5 -42 c-3 -24 -8 -174 -11 -333 -7 -320 -6 -331 50 -365 27 -17 50 -20 149 -20 l116 0 0 40 c0 35 -3 40 -24 40 -48 0 -48 4 -37 374 6 189 11 358 11 375 l0 31 -485 0 -485 0 0 -34z"/> <path d="M6558 729 c-11 -6 -18 -22 -18 -39 0 -28 2 -30 41 -30 l42 0 -6 -127 c-4 -71 -10 -219 -13 -331 l-7 -202 104 0 c80 0 110 4 128 16 21 15 61 16 465 5 710 -19 643 -21 672 12 13 15 24 36 24 46 0 16 -30 18 -432 29 -601 17 -653 20 -682 43 l-24 19 5 285 6 285 -144 0 c-79 0 -152 -5 -161 -11z"/> <path d="M7 633 c-4 -3 -7 -145 -7 -315 l0 -308 510 0 510 0 0 115 0 115 -340 0 -340 0 0 85 0 85 340 0 340 0 0 115 0 115 -503 0 c-277 0 -507 -3 -510 -7z"/> <path d="M3524 602 c-6 -4 -39 -60 -74 -124 l-62 -118 69 0 c101 0 141 14 196 71 l47 49 423 0 422 0 -3 -182 c-2 -100 -7 -187 -13 -194 -5 -6 -33 -14 -61 -16 -40 -4 -57 -11 -75 -32 -47 -55 -40 -58 141 -54 148 3 167 5 193 24 15 11 33 32 39 45 8 15 13 111 15 259 l4 235 -522 3 c-515 2 -521 2 -516 22 5 19 0 20 -103 20 -60 0 -114 -4 -120 -8z"/> <path d="M3748 433 c-16 -18 -218 -404 -218 -416 0 -15 113 -6 164 14 94 35 144 90 228 251 40 79 74 148 76 155 3 10 -24 13 -116 13 -101 0 -121 -3 -134 -17z"/> <path d="M4188 433 c-13 -15 -218 -410 -218 -420 0 -1 37 -3 83 -3 152 1 187 32 312 273 l87 167 -125 0 c-106 0 -126 -3 -139 -17z"/> </g> </svg> 优化并且重构这段svg代码
04-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值