LeetCode //C - 918. Maximum Sum Circular Subarray

918. Maximum Sum Circular Subarray

Given a circular integer array nums of length n, return the maximum possible sum of a non-empty subarray of nums.

A circular array means the end of the array connects to the beginning of the array. Formally, the next element of nums[i] is nums[(i + 1) % n] and the previous element of nums[i] is nums[(i - 1 + n) % n].

A subarray may only include each element of the fixed buffer nums at most once. Formally, for a subarray nums[i], nums[i + 1], ..., nums[j], there does not exist i <= k1, k2 <= j with k1 % n == k2 % n.

Example 1:

Input: nums = [1,-2,3,-2]
Output: 3
Explanation: Subarray [3] has maximum sum 3.

Example 2:

Input: nums = [5,-3,5]
Output: 10
Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10.

Example 3:

Input: nums = [-3,-2,-3]
Output: -2
Explanation: Subarray [-2] has maximum sum -2.

Constraints:
  • n == nums.length
  • 1 < = n < = 3 ∗ 1 0 4 1 <= n <= 3 * 10^4 1<=n<=3∗104
  • − 3 ∗ 1 0 4 < = n u m s [ i ] < = 3 ∗ 1 0 4 -3 * 10^4 <= nums[i] <= 3 * 10^4 −3∗104<=nums[i]<=3∗104

From: LeetCode

Link: 918. Maximum Sum Circular Subarray


Solution:

Ideas:

There are two possible scenarios for the maximum sum subarray in a circular array:

  1. The maximum sum subarray is similar to a regular array, i.e., it does not wrap around.
  2. The maximum sum subarray wraps around the end to the beginning of the array.

For the first scenario, we can use Kadane's algorithm directly. But for the second scenario, we need a different approach.

If the maximum sum subarray wraps around, then there's a continuous subarray at the opposite part of the array that has the minimum sum. Think of it as "taking away" the minimum sum part from the total to get the maximum circular sum.

Given this, we can use a similar approach to Kadane's algorithm to find both:

  1. The maximum subarray sum (for the first scenario).
  2. The minimum subarray sum (to help with the second scenario).
Code:
c 复制代码
int max(int a, int b) {
    return a > b ? a : b;
}

int min(int a, int b) {
    return a < b ? a : b;
}

int maxSubarraySumCircular(int* nums, int numsSize) {
    if (!nums || numsSize == 0) return 0;

    int total = 0, maxSum = -30000, curMax = 0, minSum = 30000, curMin = 0;

    for (int i = 0; i < numsSize; i++) {
        curMax = max(curMax + nums[i], nums[i]);
        maxSum = max(maxSum, curMax);
        
        curMin = min(curMin + nums[i], nums[i]);
        minSum = min(minSum, curMin);
        
        total += nums[i];
    }

    if (maxSum > 0) {
        return max(maxSum, total - minSum);
    } else {
        return maxSum;
    }
}
相关推荐
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法
moonlifesudo1 天前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法