0053最大子序列和_Leon

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

思路:
基础分而治之:left_Part、right_Part 和cross_Value三种情况

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int len = nums.size();
        if(len == 0)
            return 0;
        else 
            return maxSub(0, len-1, nums);
    }
    ```
      int maxSub(int low , int high,vector<int>& nums)
        {
            if(low == high)
                return nums[low];
            int mid = low + (high - low) / 2;
            int left = maxSub(low, mid,nums);
            int right = maxSub(mid+1, high,nums);
          
            int cross = nums[mid];
            int sum = nums[mid];
            for (int i = mid - 1; i>=low; i--)
            {
                sum += nums[i];
                cross = max(cross,sum);
            }

            sum = cross;
            for(int i = mid+1; i<=high; i ++)
            {
                sum += nums[i];
                cross = max(cross, sum);
            }
            return max(left, max(right, cross));          

        }
  
};

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        def maxSub(low, high):
            mid = low + (high - low) // 2
            if (low == high):
                return nums[low]
            else:
                left = maxSub(low, mid)
                right = maxSub(mid + 1, high)
                cross_Left = nums[mid]
                sum = nums[mid]
                i = mid - 1
                while(i >= low):
                    sum += nums[i]
                    cross_Left = cross_Left if cross_Left > sum else sum
                    i -= 1
                cross_Right = nums[mid + 1]
                sum = nums[mid + 1]
                i = mid  +  2
                while(i <= high):
                    sum += nums[i]
                    cross_Right = cross_Right if cross_Right > sum else sum
                    i += 1
                cross_Right = cross_Right if cross_Right > sum else sum
                cross = cross_Left + cross_Right 
                return max(left, right, cross)
        return maxSub(0,len(nums) - 1)
                    
      ```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容