前缀和模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 给定一个数组arr(无序),其中每个元素值可为正数、负数和 0 ,再给定一个正数k。求arr中所有连续子数组元素累加和为k的最长子数组长度。【难度:高】 示例: 输入: [ 2 , 1 , - 3 , 4 , - 1 , 2 , - 1 , - 2 , 4 , - 2 , 2 , - 2 ], k = 2 输出: 11 解释: 和为 2 的最长连续子数组 [ 1 , - 3 , 4 , - 1 , 2 , - 1 , - 2 , 4 , - 2 , 2 , - 2 ] 。 result = 0 for i in range ( len (arr)): s = 0 for j in range (i, len (arr)): s + = arr[j] if s = = k: result = max (result, j - i + 1 ) return result prefix_sum = [ 0 ] * len (arr) prefix_sum[ 0 ] = arr[ 0 ] for i in range ( 1 , len (arr): prefix_sum[i] = arr[i] + prefix_sum[i - 1 ] result = 0 for i in range ( len (arr)): for j in range (i + 1 , len (arr)): if prefix_sum[j] - prefix_sum[i] = = k: result = max (result, j - i + 1 ) return result sum (arr[i:j + 1 ]) = = sum (arr[ 0 :j + 1 ]) - sum (arr[ 0 :i]) 2 2 | | 1 3 | | - 3 0 | | 4 4 | | ... ... | | - 2 ? 使用前缀和 + hash 解决,如果使用暴力解法时间复杂度是O(N^ 2 ),使用前缀和 + hash 的复杂度为O(N),空间复杂度为O(N),参考代码: def get_max_length(arr, k): if not arr: return 0 prefix_sum = { 0 : - 1 } result, sum = 0 , 0 for i in range ( len (arr)): sum + = arr[i] path_sum = sum - k if path_sum in prefix_sum: result = max (result, i - prefix_sum[path_sum]) if sum not in prefix_sum: prefix_sum[ sum ] = i return result |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-03-28 167. Two Sum II - Input array is sorted
2018-03-28 leetcode 563. Binary Tree Tilt
2018-03-28 python 多线程