美文网首页
最大子序列和-线段树问题

最大子序列和-线段树问题

作者: dalewong | 来源:发表于2020-07-28 10:59 被阅读0次

对于范围的问题,例如最大子序列,最小子序列等都可以使用线段树来解决。

segment_tree.jpg

线段树每个节点指向左右范围节点left,right,还需要保存范围内的[最大值或者最小值]ivalue, 当前值value,左侧的最大值:left_value, 右侧的最大值: right_value.
每次计算的时候,计算左侧的最大值为: max(left.right_value ,left.right_value+value), 右侧的最大值为: max(right.left_value, right_left_value+value)
再计算左侧和右侧的最大值max(left_value, right_value, left_value+right_value)为这个范围大最大连续和
注意: 因为需要连续,所以左侧最大值只能为left.right_value+value, value的最大值


class SegmentNode(object):

    def __init__(self, value):
        self.Lvalue = 0
        self.Rvalue = 0
        self.value = value
        self.left = None
        self.right = None
        self.Ivalue = 0

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        segment = self.search(nums)
        return segment.Ivalue

    def search(self, nums):
        l, r = 0, len(nums) - 1
        middle = (l + r) / 2
        if l == r:
            return SegmentNode(nums[l])
        else:
            left_segment = self.search(nums[: middle])
            rigt_segment = self.search(nums[middle+1: ])
            segment = SegmentNode(num[middle])
            lvalue = max(left.right_value, nums[middle] +  left.right_value)
            rvalue = max(right.left_value, nums[middle] + right.left_value)
            ivalue = max(lvalue, rvalue, lvalue+rvalue)
            segment.left = left_segment
            segment.right = rigt_segment
            segment.Lvalue = lvalue
            segment.Rvalue = rvalue
            segment.Ivalue = ivalue
            return segment

或者采用滚动数组来实现

def Solution(nums):
    pre, max_result = 0, nums[0]
    for i in nums:
        pre = max(nums[i] + pre, nums[i])
        max_result = max(pre, max_result)
    return max_result

相关文章

  • 最大子序列和-线段树问题

    对于范围的问题,例如最大子序列,最小子序列等都可以使用线段树来解决。 线段树每个节点指向左右范围节点left,ri...

  • 算法导论:最大子序列和

    算法导论:最大子序列和 问题描述:什么是最大子序列和呢?就是给定一组序列,所有子序列中和最大的那一组序列。比如这里...

  • 2019-10-11

    今天学习了最长公共子序列和最大子段和问题。

  • 『算法』最大子序列和的三种算法

    最大子序列和问题是算法中一个经典问题了,不同的算法时间复杂度相差甚大。 最大子序列和 给出一组整数,求出这组数字子...

  • 最大子序列和问题

    给定整数A1,A2,...An(可能为负数),求子序列和最大值(如果所有整数为负数,则子序列和为0)。 穷举法 画...

  • 最大子序列和问题

    本题来自PAT1007

  • 最大子序列和问题(C语言)

    最大子序列和(maxSubSeqSum) 时间复杂度:T(N)=O(N3) 最大子序列和改进1(maxSubSeq...

  • 动态规划常见面试题

    子序列类型编辑距离 最长递增子序列 最大子数组 最长公共子序列 背包问题0-1背包问题 子集背包问题 完全背包问题...

  • 最长子序列问题

    最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5...

  • 数据结构-线段树

    实现一个线段树 下面实现的线段树,有三个功能: 把数组构建成一颗线段树 线段树的修改 线段树的查询 303号问题 ...

网友评论

      本文标题:最大子序列和-线段树问题

      本文链接:https://www.haomeiwen.com/subject/lapxrktx.html