列表

详情


NC302. 环形数组的连续子数组最大和

描述

给定一个长度为 n环形整数数组 nums ,返回 nums非空 连续子数组 的最大可能和 。
环形数组 意味着数组的末端将会与开头相连呈环状。例如, 的前一个数是
数据范围:



示例1

输入:

[6,-3,6]

输出:

12

说明:

从子数组 [6,6] 得到最大和 6 + 6 = 12

示例2

输入:

[4,-2,2,-4]

输出:

4

说明:

从子数组 [4] 和 [4,-2,2] 都可以得到最大和 4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 19ms, 内存消耗: 3140KB, 提交时间: 2022-03-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxSubarraySumCircular(vector<int>& nums) {
        // write code here
         int n = nums.size();
         
        // 无环的最大和
        int res = INT_MIN, sum = 0;
        for (int i = 0, last = 0; i < n; i ++ ) {
            sum += nums[i];
            last = max(last, 0) + nums[i];
            res = max(res, last);
        }
         
        int res2 = INT_MAX;
        for (int i = 0, last = 0; i < n; i ++ ) {
            last = min(last, 0) + nums[i];
            res2 = min(res2, last);
        }
         
        if (res < 0) return res;
        return max(res, sum - res2);
    }
};

C++ 解法, 执行用时: 19ms, 内存消耗: 3272KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxSubarraySumCircular(vector<int>& nums) {
        // write code here
        int n=nums.size();
        int res=INT_MIN,sum=0;
        for(int i=0,last=0;i<n;i++)
        {
            sum+=nums[i];
            last=max(last,0)+nums[i];
            res=max(res,last);
        }
        int res2=INT_MAX;
        for(int i=0,last=0;i<n;i++)
        {
            last=min(last,0)+nums[i];
            res2=min(res2,last);
        }
        if(res<0)
            return res;
        return max(res,sum-res2);
    }
};

C 解法, 执行用时: 20ms, 内存消耗: 3132KB, 提交时间: 2022-06-16

int min(int i, int j) {
    return i > j ? j : i;
}
int max(int i, int j) {
    return i > j ? i : j;
}
int maxSubarraySumCircular(int* nums, int numsLen ) {
    int sum = nums[0];
    int x = nums[0];
    int y = nums[0];
    int* p;
    p = (int*)malloc(numsLen * sizeof(int));
    p[0] = nums[0];
    for (int i = 1, z = nums[0]; i < numsLen; i++) {
        sum += nums[i];
        p[i] = max(nums[i] + p[i - 1], nums[i]);
        x = max(p[i], x);
        z = min(z, 0) + nums[i];
        y = min(y, z);
    }
    if (x < 0)
        return x;
    return max(x, sum - y);
}

C++ 解法, 执行用时: 20ms, 内存消耗: 3136KB, 提交时间: 2022-04-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxSubarraySumCircular(vector<int>& nums) {
        // write code here
        int n = nums.size(), sum = 0, maxSum = INT_MIN, minSum = INT_MAX;
        for (auto n : nums) {
            sum += n;
        }
        
        // 无环情况下连续数组的最大和
        for (int i=0, lastSum=0; i<n; ++i) {
            lastSum = max(lastSum, 0) + nums[i];
            maxSum = max(maxSum, lastSum);
        }
        
        // 无环情况下连续数组的最小和
        for (int i=0, lastSum=0; i<n; ++i) {
            lastSum = min(lastSum, 0) + nums[i];
            minSum = min(minSum, lastSum);
        }
        
        if (maxSum < 0) {
            return maxSum;
        }
        
        return max(maxSum, sum - minSum);
        
        return 0;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3140KB, 提交时间: 2022-07-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxSubarraySumCircular(vector<int>& nums) {
        // write code here
      int n = nums.size();
      int sum = 0, cnt = 0, minv = 0x3f3f3f3f;
      int cnt1 = 0, maxv = 0x9f9f9f9f;
      for (int i = 1; i <= n; i ++)
      {
        sum += nums[i-1];
        cnt  = min(nums[i - 1], cnt + nums[i - 1]);
        cnt1 = max(nums[i - 1], cnt1 + nums[i - 1]);  
        minv = min(minv, cnt);
        maxv = max(maxv, cnt1);                
      }
      if (sum == minv) return maxv;
      return max(maxv, sum - minv);
    }
};

上一题