Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求其和等于给定值的子数组的计数_Java_Algorithm - Fatal编程技术网

Java 求其和等于给定值的子数组的计数

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,

我试图理解一个程序,其中的任务是找出有多少子数组是可能的,其和等于给定值

以下是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, 4, 2, -4, 2} }
prevSum[9] = 1  // { { 3, 4, 2 } }
如果当前前缀sum
currsum
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