2023-07-20 LeetCode每日一题(环形子数组的最大和)

2023-07-20每日一题

一、题目编号

918. 环形子数组的最大和

二、题目链接

点击跳转到题目位置

三、题目描述

给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。

环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。

子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。

提示:

  • n == nums.length
  • 1 <= n <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104​​​​​​​

四、解题代码

class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n = nums.size();
        int dp[n+5];
        int max0 = INT_MIN;
        memset(dp, 0, sizeof(dp));
        int sum = 0;
        //首先不考虑循环数组
        for(int i = 0; i < n; ++i){
            if(i == 0){
                dp[i] = nums[i];
                continue;
            } else{
                dp[i] = max(nums[i] + dp[i-1], nums[i]);
            }
        max0 = max(max0, dp[i]);
        }
        int dp1[n+5];
        memset(dp, 0, sizeof(dp));
        memset(dp1, 0, sizeof(dp1));
        int pre = 0;
        for(int i = 0 ; i < n; ++i){
            pre += nums[i];
            if(i == 0){
                dp[i] = nums[i];
            } else{
                dp[i] = max(pre, dp[i-1]);
            }
        }
        pre = 0;
        for(int i = n-1; i >= 0; --i){
            pre += nums[i];
            if(i == n-1){
                dp1[i] = nums[i];
            } else{
                dp1[i] = max(pre, dp1[i+1]);
            }
        }
        for(int i = 0; i < n; ++i){
            max0 = max(max0, dp[i] + dp1[i+1]);       
        }
    return max0;
    }
};

五、解题思路

(1) 运用动态规划来解决问题。

(2) 首先先考虑不是循环数组的情况。此时用dp[i]表示为以nums[i]为末尾的子数组的最大值。i 等于 0的时候,dp[i]只能等于nums[i],当i不等于0的时候,这个时候dp[i] 要么为nums[i],要么为nums[i] 加上以nums[i-1]为末尾的子数组的最大值。即dp[i-1]+nums[i]。两者选最大值赋值给dp[i]即可。

(3) 下面考虑是循环数组的情况。首先我们知道,循环数组就一种可能,由两个部分组成,我们只需要知道是由[0 ~ i]的区间和和[j, n-1]的区间和组成的即可。所以dp[i]变为区间[0, x]的区间和(取最大的)(x <= i)。dp1[j]表示为[y, n-1]的区间和(取最大的)(y >= j)。一次遍历,取dp[i] + dp1[i+1]的最大值。

(4) 最后返回两种可能性比较后的最终的结果max0即可。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)