日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 918. 环形子数组的最大和(前缀和+单调队列)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 918. 环形子数组的最大和(前缀和+单调队列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給定一個由整數數組 A 表示的環形數組 C,求 C 的非空子數組最大可能和。

在此處,環形數組意味著數組的末端將會與開頭相連呈環狀。
(形式上,當0 <= i < A.length 時 C[i] = A[i],且當 i >= 0 時 C[i+A.length] = C[i])

此外,子數組最多只能包含固定緩沖區 A 中的每個元素一次
(形式上,對于子數組 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.length = k2 % A.length)

示例 1: 輸入:[1,-2,3,-2] 輸出:3 解釋:從子數組 [3] 得到最大和 3示例 2: 輸入:[5,-3,5] 輸出:10 解釋:從子數組 [5,5] 得到最大和 5 + 5 = 10示例 3: 輸入:[3,-1,2,-1] 輸出:4 解釋:從子數組 [2,-1,3] 得到最大和 2 + (-1) + 3 = 4示例 4: 輸入:[3,-2,2,-3] 輸出:3 解釋:從子數組 [3][3,-2,2] 都可以得到最大和 3示例 5: 輸入:[-2,-3,-1] 輸出:-1 解釋:從子數組 [-1] 得到最大和 -1提示: -30000 <= A[i] <= 30000 1 <= A.length <= 30000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-sum-circular-subarray
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 先將數組拼接一次,并計算前綴和
  • 以每個位置為結束的子數組的前綴和,需要減去前面 n 個位置里的最小的前綴和,就是這段的最大值
  • 使用單調遞增隊列來維護前面 n 個位置以內的前綴和的遞增,每次減去隊首的前綴和(最小的)
class Solution { public:int maxSubarraySumCircular(vector<int>& A) {int n = A.size(), maxsum = INT_MIN;vector<int> arr(2*n);for(int i = 0; i < 2*n; ++i){arr[i] = A[i%n];//原數組復制為 A+Aarr[i] += i>0 ? arr[i-1] : 0;//前綴和}//下面求最長長度n的子數組最大和deque<int> q;//存下標,隊列內前綴和的值保持單調遞增for(int i = 0; i < 2*n; ++i){while(!q.empty() && i-q.front() > n)//距離超了的,刪除(每個元素只能出現1次,長度最大為n)q.pop_front();maxsum = max(maxsum, arr[i]-(q.empty() ? 0 : arr[q.front()]));while(!q.empty() && arr[q.back()] > arr[i])q.pop_back();//保持隊內單調遞增q.push_back(i);}return maxsum;} };

144 ms 44 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 918. 环形子数组的最大和(前缀和+单调队列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。