leetcode - 918. Maximum Sum Circular Subarray

该文章描述了一个寻找环形数组中最大子数组和的问题,解决方案包括使用动态规划找到最大和最小子数组和,然后比较两者以考虑环形连接的影响。在特殊情况下,如果所有元素都为负数,需要处理整个数组为最小子数组的情况。时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

Description

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 * 10^4
-3 * 104 <= nums[i] <= 3 * 10^4

Solution

Solved after reading others’ solutions…

For circular lists, the max subarray lies either in the middle of the list, or be split.
在这里插入图片描述
So to solve case2, instead of finding the max subarray, we could try to find the minimum subarray.

在这里插入图片描述
Only one special case, if all the elements in the array are negative, then we would get the minimum subarray as the whole list. So we need to deal with that.

Time complexity: o ( n ) o(n) o(n)
Space complexity: o ( 1 ) o(1) o(1)

Code

class Solution:
    def max_subarray(self, nums: list) -> int:
        dp = nums[0]
        res = nums[0]
        for each_num in nums[1:]:
            dp = max(dp, 0) + each_num
            res = max(dp, res)
        return res

    def min_subarray(self, nums: list) -> int:
        dp = nums[0]
        res = nums[0]
        for each_num in nums[1:]:
            dp = each_num + min(dp, 0)
            res = min(res, dp)
        return res

    def maxSubarraySumCircular(self, nums: List[int]) -> int:
        num_sum = sum(nums)
        ans1 = self.max_subarray(nums)
        ans2 = num_sum - self.min_subarray(nums)
        return max(ans1, ans2) if ans2 != 0 else ans1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值