思路如下: 1.最关键的点在于累计和列表,这个累计和列表在后续中可以隐去,但是解决问题的关键在于考虑累计和列表

累计和列表即求到当前id下数组的和 s[i] = a[0]+a[1]+...a[i-1]

2.那么任意的一个子数组都可以由累计和列表推出 s[j]-s[i] 想要满足子数组的和等于k 即满足s[j]-s[i]=k即可

3.接下来就是求j-i最大就是最大的长度 引入哈希表,每个位置存储s[j]-k 这个值第一次出现(这样可以保证得到的长度是最长的)的位置 (也就是 值对应id)

4.最后再遍历一遍累计和数组,每一个值就是s[j] 从哈希表中找到s[j]-k对应的id,找出最大的长度即可

5.写的时候可以把累计和数组隐去,不需要实际构建出来,只要每次能获取到每个位置的累计和就可以了,把哈希表的存取放在同一个循环里,满足了复杂度的要求。

注:这里我之前一直把累计和写成sum函数,提交后一直是超时,现在发现应该是内置的sum函数用的仍然是for循环的逻辑,速度缓慢,所以直接在循环里写累加就避免了这个问题

#
# max length of the subarray sum = k
# @param arr int整型一维数组 the array
# @param k int整型 target
# @return int整型
#
class Solution:
    def maxlenEqualK(self , arr , k ):
        # write code here
        ##得到累计和列表s  2-5  其实就是 s[5]-s[2] = k
        ## 把累计和的每一个和存入哈希表中 要求第一次出现 键对应着s的值,值对应着id
        ## 接下来倒着遍历s  s[target]-k   哈希表中空值对应0  如果s[5]-k 没有
        ##则返回0  如果有值  则返回target-start 

        hash_dic = {0:-1}
        res = 0
        ss = 0
        for i in range(len(arr)):
            ss = ss+arr[i]
            if ss not in hash_dic:
                hash_dic[ss] = i
            if ss-k in hash_dic:
                res = max(i-hash_dic[ss-k],res)
        return res