Maximum Sum Circular Subarray

Given a circular array C of integers represented by A, find the maximum possible sum of a non-empty subarray of C.

Here, a circular array means the end of the array connects to the beginning of the array.  (Formally, C[i] = A[i] when 0 <= i < A.length, and C[i+A.length] = C[i] when i >= 0.)

Also, a subarray may only include each element of the fixed buffer A at most once.  (Formally, for a subarray C[i], C[i+1], ..., C[j], there does not exist i <= k1, k2 <= j with k1 % A.length = k2 % A.length.)

Example 1:

Input: [1,-2,3,-2]
Output: 3
Explanation: Subarray [3] has maximum sum 3

Example 2:

Input: [5,-3,5]
Output: 10
Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10

思路:如果做过Maximum Subarray ,这题如果看了下面的图示,应该很简单;

 image

循环的array,那么最大的subarry,那么中间就是最小的subarray,那么问题转换为求一个最大,和最小,然后两者比最大值。

注意的是:如果求出来最大的还是小于0,那么直接return 最大的;因为比如:[-2,-3,-1]  total -6, globalmax :-1, globalmin : -6

如果直接Math.max(total - globalmin, globalmax); 就会return 0, 是不对的,globalmax < 0,直接return globalmax即可;

class Solution {
    public int maxSubarraySumCircular(int[] A) {
        int total = 0;
        
        int localmax = 0;
        int globalmax = A[0];
        
        int localmin = 0;
        int globalmin = A[0];
        
        for(int a: A) {
            localmax = Math.max(localmax + a, a);
            globalmax = Math.max(globalmax, localmax);
            
            localmin = Math.min(localmin + a, a);
            globalmin = Math.min(globalmin, localmin);
            
            total += a;
        }
        return globalmax > 0 ? Math.max(total - globalmin, globalmax) : globalmax;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值