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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

1191. K 次串联后最大子数组之和(最大子段和变形)

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1191. K 次串联后最大子数组之和(最大子段和变形) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給你一個整數數組 arr 和一個整數 k。

首先,我們要對該數組進行修改,即把原數組 arr 重復 k 次。

舉個例子,如果 arr = [1, 2] 且 k = 3,那么修改后的數組就是 [1, 2, 1, 2, 1, 2]。

然后,請你返回修改后的數組中的最大的子數組之和。

注意,子數組長度可以是 0,在這種情況下它的總和也是 0。

由于 結果可能會很大,所以需要 模(mod) 10^9 + 7 后再返回。

示例 1:

輸入:arr = [1,2], k = 3
輸出:9
示例 2:

輸入:arr = [1,-2,1], k = 5
輸出:2
示例 3:

輸入:arr = [-1,-2], k = 7
輸出:0

提示:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4
這個題目,還是要求最大子段和。
①整個數組的和大于0,那么最大值就是sum*(k-1)+max1(原始數組中的最大子段和).
②在整體和不大于0大的情況下,最大值就在max1,max2(連續兩段數組的最大子段和)中取到了。
第二種情況一開始想了好多種情況,分類討論了很多。但是最后才發現,其實就是在max1和max2中取到。
代碼如下:

class Solution { public:int mod=1e9+7;int getmax(vector<int>& arr)//得到最大子段和{int _max=0;int sum=0;for(int i=0;i<arr.size();i++){sum=sum+arr[i];sum%=mod;_max=max(_max,sum)%mod;if(sum<0) sum=0;}return _max%mod;}int kConcatenationMaxSum(vector<int>& arr, int k) {int sum=0;vector<int> arr2;int t=2;if(k>=2)//只有在k>=2的時候,才可以構建兩個數組while(t--){for(int i=0;i<arr.size();i++) arr2.push_back(arr[i]);}int max1=getmax(arr);int max2=getmax(arr2);for(int i=0;i<arr.size();i++){sum=(sum+arr[i])%mod;}if(sum>0) {long long x=((long long)(k-1)*(long long)sum)+max1;//可能有人會想,為什么不是K*sum,其實x>=k*sum,所以直接寫x就可以了。x%=mod;int y=(int)x;return y;}else return max(max1,max2);} };

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的1191. K 次串联后最大子数组之和(最大子段和变形)的全部內容,希望文章能夠幫你解決所遇到的問題。

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