思路如下: 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