Java 求其和等于给定值的子数组的计数
我试图理解一个程序,其中的任务是找出有多少子数组是可能的,其和等于给定值 以下是O(N)复杂度的工作代码,取自:Java 求其和等于给定值的子数组的计数,java,algorithm,Java,Algorithm,我试图理解一个程序,其中的任务是找出有多少子数组是可能的,其和等于给定值 以下是O(N)复杂度的工作代码,取自: 上面代码中的HashMap如何有助于获得正确的结果。prevSum[i]包含从第一个元素开始的连续子数组的数量,该元素的和为i。例如,对于数组3,4,2,-4,2,条目如下所示: prevSum[3] = 1 // { { 3 } } prevSum[5] = 1 // { { 3, 4, 2, -4 } } prevSum[7] = 2 // { { 3, 4 }, { 3,
上面代码中的HashMap如何有助于获得正确的结果。
prevSum[i]
包含从第一个元素开始的连续子数组的数量,该元素的和为i
。例如,对于数组3,4,2,-4,2
,条目如下所示:
prevSum[3] = 1 // { { 3 } }
prevSum[5] = 1 // { { 3, 4, 2, -4 } }
prevSum[7] = 2 // { { 3, 4 }, { 3, 4, 2, -4, 2} }
prevSum[9] = 1 // { { 3, 4, 2 } }
如果当前前缀sumcurrsum
为10
,并且正在查找求和为K=3
的子数组,则需要删除以第一个元素开头并求和为7
的子数组,以获得求和为3
的适当子数组。例如:
3, 4, 2, -4, 2, 1, 2, -5, 2
^
|------------------|
currsum = 10
|--| -> sums to 7
|-------------| -> sums to 3
|------------| -> sums to 7
|--| -> sums to 3
因此,在这个位置,您发现了两个可能的子阵列,它们的总和为K
。因此,res+=prevSum.get(currsum-K)
prevSum[3] = 1 // { { 3 } }
prevSum[5] = 1 // { { 3, 4, 2, -4 } }
prevSum[7] = 2 // { { 3, 4 }, { 3, 4, 2, -4, 2} }
prevSum[9] = 1 // { { 3, 4, 2 } }
3, 4, 2, -4, 2, 1, 2, -5, 2
^
|------------------|
currsum = 10
|--| -> sums to 7
|-------------| -> sums to 3
|------------| -> sums to 7
|--| -> sums to 3