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;
    }
}
相关推荐
生态学者8 小时前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台
lsswear8 小时前
Agent 框架新手入门与实战部署指南
大数据·人工智能·算法
学逆向的8 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
Data analyse45610 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
Navigator_Z11 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode
Nil20812 小时前
leetcode 64最小路径和
算法·leetcode·职场和发展
光影少年12 小时前
AI Agent、自动化与未来工作
人工智能·算法·架构
牧羊人.33312 小时前
计算机视觉基础 第16章|EigenFace,FisherFace,LBPH传统人脸识别算法
人工智能·算法·计算机视觉
jeo陽12 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
Nil20812 小时前
leetcode 72编辑距离
算法·leetcode·职场和发展