一個序列的平衡點是這樣的,它的左邊的所有的元素的和應該等於右邊的所有的元素的和,比如在下面的序列A:
A[0] = -7 A[1] = 1 A[2] = 5A[3] = 2 A[4] = -4 A[5] = 3A[6] = 0
3是一個平衡點因為:
- A[0] + A[1] + A[2] = A[4] + A[5] + A[6]
6也是一個平衡點因為:
- A[0] + A[1] + A[2] + A[3] + A[4] + A[5] = 0
(零個元素的和是零) 索引7不是平衡點,因為它不是序列A的有效索引。
如果你仍然不是很清楚,那麼這裡給出了明確的定義:0 ≤ k < n 並且 sum[i=0]k-1A[i] = sum[i=k+1]n-1 A[i]。時, 整數k是序列A[0], A[1], ..., A[n−1]$ 的平衡點,這裡我們假定零個元素的和為零。
請寫一個函數
int equi(int A[], int N);
返回給定序列的平衡點(任意一個)如果沒有平衡點則返回−1,假設這個序列可達到非常大。
假定:
- N 是 [0..10,000,000] 內的 整數;
- 數組 A 每個元素是取值範圍 [−2,147,483,648..2,147,483,647] 內的 整數 .
複雜度:
- 最壞-情況下,期望的時間複雜度是 O(N);
- 最壞-情況下,期望的空間複雜度是 O(N), 輸入儲存除外 (不計輸入參數所需的儲存空間).
輸入數組中的元素可以修改
C#給出兩個思路一樣只是寫法有點不同的方法:
方法一:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 class Solution { 5 public int equi ( int[] A ) { 6 if (A.Length <= 2) 7 return -1; 8 long summary = A.Sum(); 9 long left = 0;10 11 for (int i = 1; i < A.Length; i++)12 {13 left += A[i - 1];14 if (A[i] == left && summary - left - A[i] == A[i])15 return i;16 }17 return -1;18 }19 }
方法二:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 class Solution { 5 public int equi ( int[] A ) { 6 if (A.Length == 0) 7 return -1; 8 long summary = A.Sum(); 9 10 long sum_left = 0;11 for (int i = 0; i < A.Length; i++)12 {13 long sum_right = summary - sum_left - A[i];14 if (sum_left == sum_right)15 {16 return i;17 }18 sum_left += A[i];19 }20 return -1;21 }22 }
這兩種寫法優劣請大家一起來評判一下。
========================華麗的分割線==========================
測試網站上給出的評判:
方法一:
Analysis
| test |
time |
result |
example Test from the task description |
0.080 s. |
OK |
| simple |
0.080 s. |
OK |
extreme_large_numbers Sequence with extremly large numbers testing arithmetic overflow. |
0.070 s. |
RUNTIME ERROR tested program terminated unexpectedly stdout:
Unhandled Exception: System.OverflowException: Number overflow. at System.Linq.Enumerable.<Sum>m__5E (Int32 a, Int32 b) [0x00000] at System.Linq.Enumerable.Sum[Int32,Int32] (IEnumerable`1 source, System.Func`3 selector) [0x00000] at System.Linq.Enumerable.Sum (IEnumerable`1 source) [0x00000] at Solution.equi (System.Int32[] A) [0x00000] at SolutionWrapper.run (System.String input, System.String output) [0x00000] at SolutionWrapper.Main (System.String[] args) [0x00000] |
| overflow_tests |
0.080 s. |
RUNTIME ERROR tested program terminated unexpectedly stdout:
Unhandled Exception: System.OverflowException: Number overflow. at System.Linq.Enumerable.<Sum>m__5E (Int32 a, Int32 b) [0x00000] at System.Linq.Enumerable.Sum[Int32,Int32] (IEnumerable`1 source, System.Func`3 selector) [0x00000] at System.Linq.Enumerable.Sum (IEnumerable`1 source) [0x00000] at Solution.equi (System.Int32[] A) [0x00000] at SolutionWrapper.run (System.String input, System.String output) [0x00000] at SolutionWrapper.Main (System.String[] args) [0x00000] |
one_large one large number at the end of the sequence |
0.070 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 0 |
sum_0 sequence with sum=0 |
0.070 s. |
OK |
single single number |
0.070 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 0 |
empty Empty array |
0.060 s. |
OK |
combinations_of_two multiple runs, all combinations of {-1,0,1}^2 |
0.080 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 0 |
combinations_of_three multiple runs, all combinations of {-1,0,1}^3 |
0.080 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 0 |
| small_pyramid |
0.070 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 42 |
| large_long_sequence_of_ones |
0.130 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 50000 |
| large_long_sequence_of_minus_ones |
0.110 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 50002 |
| medium_pyramid |
0.090 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 402 |
large_pyramid Large performance test, O(n^2) solutions should fail. |
0.160 s. |
WRONG ANSWER got -1, but equilibrium point exists, for example on position 898 |
方法二:
Analysis
Detected time complexity:
O(N)
| test |
time |
result |
example Test from the task description |
0.100 s. |
OK |
| simple |
0.090 s. |
OK |
extreme_large_numbers Sequence with extremly large numbers testing arithmetic overflow. |
0.070 s. |
RUNTIME ERROR tested program terminated unexpectedly stdout:
Unhandled Exception: System.OverflowException: Number overflow. at System.Linq.Enumerable.<Sum>m__5E (Int32 a, Int32 b) [0x00000] at System.Linq.Enumerable.Sum[Int32,Int32] (IEnumerable`1 source, System.Func`3 selector) [0x00000] at System.Linq.Enumerable.Sum (IEnumerable`1 source) [0x00000] at Solution.equi (System.Int32[] A) [0x00000] at SolutionWrapper.run (System.String input, System.String output) [0x00000] at SolutionWrapper.Main (System.String[] args) [0x00000] |
| overflow_tests |
0.070 s. |
RUNTIME ERROR tested program terminated unexpectedly stdout:
Unhandled Exception: System.OverflowException: Number overflow. at System.Linq.Enumerable.<Sum>m__5E (Int32 a, Int32 b) [0x00000] at System.Linq.Enumerable.Sum[Int32,Int32] (IEnumerable`1 source, System.Func`3 selector) [0x00000] at System.Linq.Enumerable.Sum (IEnumerable`1 source) [0x00000] at Solution.equi (System.Int32[] A) [0x00000] at SolutionWrapper.run (System.String input, System.String output) [0x00000] at SolutionWrapper.Main (System.String[] args) [0x00000] |
one_large one large number at the end of the sequence |
0.070 s. |
OK |
sum_0 sequence with sum=0 |
0.080 s. |
OK |
single single number |
0.070 s. |
OK |
empty Empty array |
0.060 s. |
OK |
combinations_of_two multiple runs, all combinations of {-1,0,1}^2 |
0.070 s. |
OK |
combinations_of_three multiple runs, all combinations of {-1,0,1}^3 |
0.070 s. |
OK |
| small_pyramid |
0.070 s. |
OK |
| large_long_sequence_of_ones |
0.100 s. |
OK |
| large_long_sequence_of_minus_ones |
0.120 s. |
OK |
| medium_pyramid |
0.090 s. |
OK |
large_pyramid Large performance test, O(n^2) solutions should fail. |
0.160 s. |
OK |