現在給你兩個長度均為N的整數陣列 A 和 B。

當(A[0]+。。。A[K-1]),(A[K]+。。。+A[N-1]),(B[0]+。。。+B[K-1]) 和 (B[K]+。。。+B[N-1])四個和值大小相等時,稱索引K是一個公平索引。也就是說,索引K 可以使得A, B 兩個陣列被分成兩個非空陣列,這四個子陣列的和值相等。

例如,陣列A = [4,-1,0,3],B = [-2,5,0,3],那麼索引 K = 2是公平的,子陣列的和相等:4+(-1) = 3; 0+3 = 3; -2 + 5 = 3 and 0 + 3 = 3。

現在請你計算公平索引的個數。

2<=N<=100000

-1000000000<=a[i],b[i]<=1000000000 (0<=i

線上評測地址:LintCode 領釦

樣例 1:

輸入: [4,-1,0,3] [-2,5,0,3]

輸出: 2

樣例 2:

輸入: [2,-2,-3,3]

[0,0,4,-4]

輸出: 1

樣例 3:

輸入: [4,-1,0,3] [-2,6,0,4]

輸出: 0

樣例 4:

輸入: [1,4,2,-2,5] [7,-2,-2,2,5]

輸出: 2

【題解】

先判斷兩個陣列總和是否相等,若不相等,則直接返回0;

然後掃一遍陣列,用pre_a和pre_b分別記錄兩個陣列的字首和,字首和相等並且等於剩餘的部分的時候時ans++即可。

需要注意的是,陣列中數的值在[-1e9,1e9]範圍內,陣列長度[0,1e5],所以中間和會超出int範圍,需要用long;

還有被分成的兩個陣列不能為空,所以字首和p[0]和p[n-1]是不考慮的;

public

class

Solution

{

/**

* @param A: an array of integers

* @param B: an array of integers

* @return: return a integer indicating the number of fair indexes。

*/

public

int

CountIndexes

List

<

Integer

>

A

List

<

Integer

>

B

{

int

ans

=

0

long

sum_a

=

0

sum_b

=

0

pre_a

=

0

pre_b

=

0

for

int

i

=

0

i

<

A

size

();

i

++)

{

sum_a

+=

A

get

i

);

sum_b

+=

B

get

i

);

}

if

sum_a

!=

sum_b

return

0

for

int

i

=

0

i

<

A

size

()

-

1

i

++)

{

pre_a

+=

A

get

i

);

pre_b

+=

B

get

i

);

if

pre_a

==

pre_b

&&

pre_a

==

sum_a

-

pre_a

ans

++;

}

return

ans

}

}

更多語言程式碼參見:九章演算法