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;
    }
}
相关推荐
不吃洋葱.23 分钟前
前缀和|差分
数据结构·算法
阿捏利3 小时前
C Primer Plus 第6版 编程练习——第7章(上)
c语言·编程题·c primer plus
是白可可呀3 小时前
LeetCode 169. 多数元素
leetcode
jz_ddk3 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
CloudAce云一3 小时前
谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
算法
轻语呢喃4 小时前
每日LeetCode : 杨辉三角
javascript·后端·算法
码农Cloudy.4 小时前
C语言<数据结构-链表>
c语言·数据结构·链表
YuTaoShao4 小时前
【LeetCode 热题 100】148. 排序链表——(解法二)分治
java·算法·leetcode·链表
Shilong Wang4 小时前
三维旋转沿轴分解
算法·计算机视觉·机器人
星竹晨L4 小时前
C语言——预处理详解
c语言·开发语言