Leetcode 2926. Maximum Balanced Subsequence Sum

本文介绍了LeetCode题目2926中的最大平衡子序列和问题,通过观察题目的规律,利用分段树数据结构实现了一个高效的解决方案。作者分享了解题思路和Python代码,展示了如何在给定限制条件下求最大值并优化时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这道题很惭愧,是看了大佬们的答案之后才搞定的。

这道题感觉是一个套路题目,就是给定限制条件,然后在给定的限制条件下面求最大值的问题。因为显然题中给出的大小关系是存在传递性的,因此我们要做的就是找每一个位置idx后面满足组合要求的位置当中能够获得的最大值。

但是这里的难度就在于如何在限制条件下求最大值。

这里看了一下大佬们的解答之后得到的一个思路就是说每次还是求所有idx之后所有位置上的最大值,但是每次按照大小关系update位置,确保在计算idx时后续所有的位置要么还没有值,如果有值就一定是符合条件的组合。

在这种情况下就转化为了求某一个位置之后的最大值了,这个就可以用分段树进行实现了。

2. 代码实现

给出python代码实现如下:

class SegmentTree:
    def __init__(self, arr):
        self.length = len(arr)
        self.tree = self.build(arr)

    def feature_func(self, *args):
        return max(args)

    def build(self, arr):
        n = len(arr)
        tree = [0 for _ in range(2*n)]
        for i in range(n):
            tree[i+n] = arr[i]
        for i in range(n-1, 0, -1):
            tree[i] = self.feature_func(tree[i<<1], tree[(i<<1) | 1])
        return tree

    def update(self, idx, val):
        idx = idx + self.length
        self.tree[idx] = val
        while idx > 1:
            self.tree[idx>>1] = self.feature_func(self.tree[idx], self.tree[idx ^ 1])
            idx = idx>>1
        return

    def query(self, lb, rb):
        lb += self.length 
        rb += self.length
        nodes = []
        while lb < rb:
            if lb & 1 == 1:
                nodes.append(self.tree[lb])
                lb += 1
            if rb & 1 == 0:
                nodes.append(self.tree[rb])
                rb -= 1
            lb = lb >> 1
            rb = rb >> 1
        if lb == rb:
            nodes.append(self.tree[rb])
        return self.feature_func(*nodes)


class Solution:
    def maxBalancedSubsequenceSum(self, nums: List[int]) -> int:
        n = len(nums)
        segment_tree = SegmentTree([-math.inf for _ in range(n)])
        ids = sorted(range(n), key=lambda x: (nums[x]-x, x), reverse=True)
        for idx in ids:
            if idx == n-1:
                segment_tree.update(idx, nums[idx])
            else:
                _max = segment_tree.query(idx+1, n-1)
                segment_tree.update(idx, nums[idx] + max(0, _max))
        return segment_tree.query(0, n-1)

提交代码评测得到:耗时3867ms,占用内存41.1MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值