累加和为目标值的最长子数组、异或和为0的最大划分(注意思想)

本文探讨了如何找到累加和为目标值的最长子数组,包括奇数偶数长度相等且累加和为0的情况,以及仅包含正数的情况。采用双指针法和哈希表等数据结构,实现了O(N)的时间复杂度解决方案。此外,还讨论了异或和为0的最大划分问题,提供了相关参考资料链接。
摘要由CSDN通过智能技术生成

思路
对每个位置进行考虑分析,然后从中找到最大的
1、累加和为目标值的最长子数组(哈希表)
奇数偶数长度相等的最长子数组(奇数为1,偶数为-1,求累加和为0的最长子数组)

def longestSumArray(arr,k):  #k为目标值
    dict={}         #记录每个位置的累加和,key为累加和,value为当前位置
    ll=0            #输出
    summ=0
    dict[0]=-1 #重要步骤,位置-1的累加和为0
    for i in range(len(arr)):
        summ+=arr[i]
        if summ-k in dict:       #sum-k出没出现过
            ll=max(i-dict[summ-k],ll)   #出现过,长度则为i-dict[summ-k],没出现过,长度为0
        if summ not in dict:   #更新dict,累加和出现过不更新
            dict[summ]=i
    return ll
arr=[7,3,2,1,1,7,-6,-1,7]
print(longestSumArray(arr,7))

1(2)累加和为目标值的最大子数组(仅有正数):双指针法【单调性】

def maxlen(arr,aim):
    if not arr or len(arr)==0 or aim<=0:
        return 0
    l=0
    r=0
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值