Leetcode 1191 K-連結最大合計動的プログラミング
タイトル説明
Given an integer array arr and an integer k, modify the array by repeating it k times.
For example, if arr = [1, 2] and k = 3 then the modified array will be [1, 2, 1, 2, 1, 2].
Return the maximum sub-array sum in the modified array. Note that the length of the sub-array can be 0 and its sum in that case is 0.
As the answer can be very large, return the answer modulo 10^9 + 7.
例
Example 1:
Input: arr = [1,2], k = 3
Output: 9
Example 2:
Input: arr = [1,-2,1], k = 5
Output: 2
Example 3:
Input: arr = [-1,-2], k = 7
Output: 0
問題解決のためのアイデア
まず、新しい方法maxSum(k)を定義します。K == 1、及びkサイクル時間を解決する方法。しかし、時間は、複雑さの要件を満たしていません。以下は、最適化手法です。
ときLEN(ARR)== 0、0が返されます。
K <3とき、結果は直接Kに応じて決定することができます。
K <= 3、総和がアレイARR入金されたときに
合計<= 0の場合、結果は、両方の場合においてmaxSum(1)及びmaxSum(2)を有している場合、
場合和> 0、そこmaxSum(2)+(K -2)*合計。
Java代码
class Solution {
public int kConcatenationMaxSum(int[] arr, int k) {
if ( arr.length == 0 || arr == null ) return 0;
if (k < 3) return (int) (maxSum(arr, k)%(1e9+7));
long sum = 0; for(int num:arr) sum += num;
long ans = maxSum(arr, 2);
return (int) ((ans + (sum>0 ? sum:0) * (k-2))%(1e9+7));
}
private long maxSum(int[] arr, int k){
long sum=0, ans=0;
for(int i=0; i<k; i++){
for(int num : arr){
sum = Math.max(0, sum+=num);
ans = Math.max(sum, ans);
}
}
return ans;
}
}
Python代码
class Solution:
def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
def maxSum(arr, res = 0, cur = 0):
for num in arr:
res = max(0, res+num)
cur = max(cur, res)
return cur
return ( (k-2)*max(sum(arr), 0) + maxSum(arr*2) )%(10**9+7) if k>1 else maxSum(arr)%(10**9+7)