Sum of elements of lower indices is equal to the sum of elements of higher indices
Em chưa hiểu đề lắm nên thắc mắc như sau: nếu trường hợp a(2) là cân bằng thì sẽ là a(0) +a(1) = a(3)+a(4)+a(5)+a(6)+a(7) có đúng ko ạ
This is a demo task.
An array A consisting of N integers is given. An equilibrium index of this array is any integer P such that 0 ≤ P < N and the sum of elements of lower indices is equal to the sum of elements of higher indices, i.e.
A[0] + A[1] + … + A[P−1] = A[P+1] + … + A[N−2] + A[N−1].
Sum of zero elements is assumed to be equal to 0. This can happen if P = 0 or if P = N−1.
For example, consider the following array A consisting of N = 8 elements:
A[0] = -1
A[1] = 3
A[2] = -4
A[3] = 5
A[4] = 1
A[5] = -6
A[6] = 2
A[7] = 1
P = 1 is an equilibrium index of this array, because:
A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7]
P = 3 is an equilibrium index of this array, because:
A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7]
P = 7 is also an equilibrium index, because:
A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0
and there are no elements with indices greater than 7.
P = 8 is not an equilibrium index, because it does not fulfill the condition 0 ≤ P < N.
Write a function:
int solution(int A[], int N);
that, given an array A consisting of N integers, returns any of its equilibrium indices. The function should return −1 if no equilibrium index exists.
For example, given array A shown above, the function may return 1, 3 or 7, as explained above.
Assume that:
N is an integer within the range [0…100,000];
each element of array A is an integer within the range [−2,147,483,648…2,147,483,647].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N) (not counting the storage required for input arguments).
Khi P = 2 là giá trị cân bằng thì a[0] + a[1] = a[3] + a[4] + … + a[7].
vậy bài này chi cần lấy left so sánh với right của phần tử đó thôi ạ? nếu bằng thì chỗ đó là cân bằng
Không đúng. Khi ta đã có tổng dãy
sum
thì dùng đại số sẽ có: [spoiler]2*acc_sum == sum - a[p]
[/spoiler].acc_sum là cái gì vậy ạ, là sum/2 ạ?
Về cơ bản là vậy, hiện mình chỉ nghĩ ra cách này thôi :
[details=Cách làm]Đặt một
int left = 0
, mộtint right
= tổng các phần tử tửA[2] --> A[N - 1]
Rồi lại dùng 1 hàm for nữa chạy từ 2 --> N - 1, lúc đó
nếu
left == right
thì i chính là số cần tìm :)[/details]Bạn cho lời giải vào spoil nhé
[spoiler]Cho i chạy từ 1 -> N thì acc_sum = a[1] + a[2] + … + a[i]. Ta có left + a[i+1] + right = sum […][/spoiler]
Đã giải xong, ai muốn xem thì click vào dòng text này nha
Input
Output
^
O(N^2) rồi này bạnwhoops…yeah, đó nó chấm điểm performance nữa anh ạ, O(N^2) hình như chỉ có 58 điểm thôi, còn dưới đây em có search trên mạng là 100 điểm, các huynh đệ tỉ mụi thích thì nghía ạ
Na ná cách của mình :)) thử hộ mình xem cách này nó chấm bao nhiêu với
[details=Code]```
public static void find(int[] Input)
{
int right = 0, left = 0;
for(int i = 1; i < Input.length; i++)
{
right += Input[i];
}
}
Code của mình O(n) mà
Link bài giải nè, có 100% JavaScript, C#, Java (giống như cái bạn copy). Kéo xuống dưới có comment về dynamic programming của Hilary Brobbey, ý tưởng code của ổng giống ý tưởng của mình.
A zero-indexed array given & An equilibrium index of this array
Thuật toán trên mình thấy đang linear Sum cho array.
Liệu cách sum này có được gọi là < O(N) ? (Nó ngẻo ở vấn đề memory )
T(n) = 2T(n/2) + O(1) = O(n) mem cũng O(n) luôn, nhưng là stack nên chết sình
Lí do thì giống như đá World Cup vậy thôi.