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 numsi is nums(i + 1) % n and the previous element of numsi 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 numsi, numsi + 1, ..., numsj, 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 <= numsi <= 3 * 10^4 −3∗104<=numsi<=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;
    }
}
相关推荐
Java_2017_csdn4 分钟前
ComplexKeysShardingAlgorithm 小结
java·大数据·算法
海梨花9 分钟前
快手面试高频算法题
java·算法·面试
lqqjuly11 分钟前
超分辨率算法深度解析(Super-Resolution Algorithms)
算法
apocelipes1 小时前
GNU GCC 多版本函数扩展
c语言·c++·linux编程
辰痕~1 小时前
指针,结构体,动态内存分配
c语言
嵌入式老牛2 小时前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
luj_17682 小时前
残熵算法:风险缓冲与效率优化的融合
c语言·开发语言·网络·经验分享·算法
Legendary_0082 小时前
从 DC 圆口到 USB-C PD:LED 照明设备的供电升级逻辑
c语言·开发语言
oddsand12 小时前
pgvector 三大相似度算法
人工智能·算法·机器学习
运筹vivo@3 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题