<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      題目

      見上一篇: 較難算法美麗塔時間復雜度O(n)-CSDN博客

      時間復雜度

      O(n)

      分析

      接著上篇。從左向右依次處理Left,處理Left[i]時,從右向左尋找第一個符合maxHeights[j]<maxHeights[i]的j。如果j1<j2,且maxHeights[j1]>=maxHeights[j2],那j1永遠不會被選到。比如:{1,3,2,4,5},由于2在3右邊,且小于3,則無論如何不會選中3。{1,2,2.....},后面無論有什么數,都不會選中第一個2,要么是其他數,要么是第二個2。
      可以用棧實現,入棧maxHeights[i]之前,先出棧大于等于maxHeights[i]的數,剩余的都小于maxHeights[i]的數。也就是棧按升序排序的。由于maxHeights[i]和heights[i]都可以通過索引查詢,棧中只需要記錄索引。
      Right類似,不再累贅。

      樣例分析

      maxHeights

      Left的棧情況

      {1,2,3,4,5}

      1

      12

      123

      1234

      12345

      {5,4,3,2,1}

      5

      4

      3

      2

      1

      {1,2,4,3,5}

      1

      12

      124

      123

      1235

      {3,1,2}

      3

      1

      12

      {2,1,3}

      2

      1

      13

      代碼

      核心代碼

      class Solution {
      public:
          long long maximumSumOfHeights(vector<int>& maxHeights) {
              m_c = maxHeights.size();
              m_vLeft.resize(m_c);
              m_vRight.resize(m_c);
              {//處理左邊
                  stack<int> sta;//記錄做邊的索引
                  for (int i = 0; i < m_c; i++)
                  {
                      const auto& h = maxHeights[i];
                      while (sta.size() && (maxHeights[sta.top()] >= h))
                      {
                          sta.pop();//左邊比右邊大,不會被選中
                      }
                      if (sta.size())
                      {
                          m_vLeft[i] = m_vLeft[sta.top()] + (long long)h * (i - sta.top());
                      }
                      else
                      {
                          m_vLeft[i] =  (long long)h * (i -(-1) );
                      }
                      sta.emplace(i);
                  }
              }
      
              {//處理右邊
                  stack<int> sta;//記錄做邊的索引
                  for (int i = m_c - 1; i >= 0; i--)
                  {
                      const auto& h = maxHeights[i];
                      while (sta.size() && (maxHeights[sta.top()] >= h))
                      {
                          sta.pop();//左邊比右邊大,不會被選中
                      }
                      if (sta.size())
                      {
                          m_vRight[i] = m_vRight[sta.top()] + (long long)h * (sta.top()-i);
                      }
                      else
                      {
                          m_vRight[i] = (long long)h * (m_c-i);
                      }
                      sta.emplace(i);
                  }
              }
              
              long long llRet = 0;
              for (int i = 0; i < m_c; i++)
              {//假定i是山頂            
                  long long llCur = m_vLeft[i] + m_vRight[i] - maxHeights[i];
                  llRet = max(llRet, llCur);
              }
              return llRet;
          }
          int m_c;
          vector<long long> m_vLeft, m_vRight;
      };

      測試用代碼

      class CDebug : public Solution
      {
      public:
          long long maximumSumOfHeights(vector<long long>& maxHeights, vector<long long>& vLeft, vector<long long>& vRight)
          {
              vector<int> maxs(maxHeights.begin(), maxHeights.end());
              long long llRet = Solution::maximumSumOfHeights(maxs);
              for (int i = 0 ; i < vLeft.size();i++ )
              {
                  assert(m_vLeft[i] == vLeft[i]);
                  assert(m_vRight[i] == vRight[i]);
              }

              //調試用代碼
              std::cout << "Left: ";
              for (int i = 0; i < m_c; i++)
              {
                  std::cout << m_vLeft[i] << " ";
              }
              std::cout << std::endl;
              std::cout << "Right: ";
              for (int i = 0; i < m_c; i++)
              {
                  std::cout << m_vRight[i] << " ";
              }
              std::cout << std::endl;
              return llRet;
          }
      };
      int main()
      {
          vector < vector<vector<long long>>> param = { {{1,2,3,4,5} ,{1,3,6,10,15},{5,8,9,8,5}} ,
              {{5,4,3,2,1},{5,8,9,8,5},{15,10,6,3,1}} ,
              {{1,2,4,3,5},{1,3,7,9,14},{5,8,10,6,5}},
          {{3,1,2}, {3,2,4},{5,2,2}},
          {{2,1,3},{2,2,5},{4,2,3}},
              {{1000000000,1000000000,1000000000},{1000000000,2000000000,3000000000LL},{3000000000LL,2000000000,1000000000}} };
          for (auto& vv : param)
          {
              auto res = CDebug().maximumSumOfHeights(vv[0], vv[1], vv[2]);
          }
          //auto res = Solution().maxPalindromes("rire", 3);

      //CConsole::Out(res);
      }

      測試環境

      Win10,VS2022 C++17

      下載

      源碼: 【免費】美麗塔單調棧O(n)解法資源-CSDN文庫

      doc 講解排版好:【免費】聞缺陷則喜算法冊(9月24增加美麗塔)資源-CSDN文庫

      posted on 2023-09-27 12:37  聞缺陷則喜何志丹  閱讀(48)  評論(0)    收藏  舉報  來源



      主站蜘蛛池模板: 国产稚嫩高中生呻吟激情在线视频| 久久精品国产99国产精品严洲| 成全影视大全在线观看| 久久亚洲精品无码播放| 国产精品一码二码三码四码| 四虎国产精品永久入口| 免费无码黄十八禁网站| 国产AV大陆精品一区二区三区| 久久综合给合久久狠狠狠88| 欧美日韩精品一区二区三区不卡| 黑人巨大无码中文字幕无码| 老妇女性较大毛片| 中文字幕少妇人妻精品| 无码va在线观看| 国产成人拍国产亚洲精品| 国产精品三级国产精品高| 国产精品免费AⅤ片在线观看| 亚洲精品日本久久久中文字幕| 中文字幕久区久久中文字幕| 成人免费看片又大又黄| 人妻精品动漫H无码中字| 美日韩精品综合一区二区| 国产色a在线观看| 欧美高清freexxxx性| 最新国产精品亚洲| 久久精品噜噜噜成人av| 久久精品国产久精国产果冻传媒| AV极品无码专区亚洲AV| 孝感市| 人人澡人人透人人爽| 精品久久久久久无码免费| 国产精品午夜福利精品| 精品精品国产国产自在线| 国产av午夜精品福利| 井陉县| 久久综合激情网| 加勒比无码人妻东京热| 免费国产高清在线精品一区| 国产精品自拍午夜福利| 白水县| 亚洲婷婷综合色高清在线 |