Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn't one, return 0 instead.
Example 1:
Given nums = [1, -1, 5, -2, 3]
, k = 3
,
return 4
. (because the subarray [1, -1, 5, -2]
sums to 3 and is the longest)
Example 2:
Given nums = [-2, -1, 2, 1]
, k = 1
,
return 2
. (because the subarray [-1, 2]
sums to 1 and is the longest)
Follow Up:
Can you do it in O(n) time?
不看Follow Up,直接最快想到的就是把所有的subarray拿出来求值啊,然后比大小啊
result = []
for i in xrange(len(nums)):
for j in xrange(i, len(nums)):
curr = nums[i:j+1]
if sum(curr) == k:
result.append(nums[i:j+1])
if len(result) == 0:
return 0
return max([len(i) for i in result])
瞬间搞定。需要注意的是一些test case可能出现最终给一个空的list,就是题目提到的,检查一下返回0就是了。
但是这样速度太慢了。是O(n*n)
参考之后有一个O(n)的算法
class Solution(object):
def maxSubArrayLen(self, nums, k):
result, acc = 0, 0
dic = {0: -1}
for i in xrange(len(nums)):
acc += nums[i]
if acc not in dic:
dic[acc] = i
if acc - k in dic:
result = max(result, i - dic[acc-k])
return result
使用字典数据结构,然后累加之后对index进行比较。
Tip:累加为0需要先填写,否则中间段出现的0的话,就会值计算从中间段开始的index,而出现0的话应该从头计算,因为之前的所有加起来刚好是0,需要补充到最大的subarray里。