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;
    }
}
相关推荐
顶点多余9 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考10 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha601611 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘12 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
Brilliantwxx13 小时前
【C语言】 初入嵌入式C语言复习(基础+进阶面试题)
c语言·开发语言
wuminyu14 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
维克兜率天14 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
rhythm-ring14 小时前
宏定义续行符 \ 的使用与踩坑
c语言·c++
AI情绪识别开源15 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶15 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法