uacs2024

导航

leetcode 1191. K 次串联后最大子数组之和 未解决

1191. K 次串联后最大子数组之和

很蠢但能通过的方法:k >= 3时,算三次res。如果res2 -  res2 == res3 - res2,说明为等差数列。如果res2 -  res2 != res3 - res2,说明循环多次的结果都是一样的。

class Solution {
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) {
        const int MOD = 1'000'000'007;
        int size = arr.size();
        if(size == 1){
            if(arr[0] > 0)  return (arr[0] * k) % MOD;
            else  return 0;
        }

        vector<int> dp(size);
        dp[0] = arr[0];
        int res = arr[0];

        for(int i = 1;i < size;++i){
            dp[i] = max(dp[i-1] + arr[i],arr[i]);
            res = max(res,dp[i]);
        }
        if(res < 0)  return 0;
        if(k == 1)  return res % MOD;

        int t1Res = res;
        for(int i = 0;i < size;++i){
            if(i == 0){
                dp[0] = max(dp[size-1] + arr[0],arr[0]);
                res = max(res,dp[0]);continue;
            }
            dp[i] = max(dp[i-1] + arr[i],arr[i]);
            res = max(res,dp[i]);
        }
        if(k == 2)  return res % MOD;
        
        int t2Res = res;
        for(int i = 0;i < size;++i){
            if(i == 0){
                dp[0] = max(dp[size-1] + arr[0],arr[0]);
                res = max(res,dp[0]);continue;
            }
            dp[i] = max(dp[i-1] + arr[i],arr[i]);
            res = max(res,dp[i]);
        }
        if(k == 3)  return res % MOD;

        if(t2Res - t1Res != res - t2Res)  return res;

        return (t1Res + (long)(k-1)*(t2Res-t1Res)) % MOD;
        
    }
};

 

posted on 2024-12-30 21:44  ᶜʸᵃⁿ  阅读(11)  评论(0)    收藏  举报