• 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<=3104
    • − 3 ∗ 1 0 4 < = n u m s [ i ] < = 3 ∗ 1 0 4 -3 * 10^4 <= nums[i] <= 3 * 10^4 3104<=nums[i]<=3104

    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:
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    浅谈word格式:.doc和.docx的优缺点及区别
    公司敏感数据被上传Github,吓得我赶紧改提交记录
    absolute 定位
    STL应用 —— deque
    【C++】一文带你吃透string的模拟实现 (万字详解)
    大数据Flink(九十七):EXPLAIN、USE和SHOW 子句
    PostgreSQL数据库----pgAdmin客户端工具的使用
    混币器Tornado遭制裁 对DeFi市场意味着什么?
    力扣 899. 有序队列
    FPGA配置采集AR0135工业相机,提供2套工程源码和技术支持
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133898518