01/10/2018, 16:40

A min abs slice is a slice whose absolute sum is minimal

Trước hết cảm ơn các anh chị / bạn đã tham gia giải đáp các vấn đê cho em thời gian qua. Em ko có đủ năng lực để giải đáp vấn đề của người khác toàn đi hỏi, thật ngại, xin thư lỗi ạ.

Đề này bảo mình tìm tổng nhỏ nhất đúng ko ạ? em thắc mắc vì sao có (1, 3) mà ko có cặp (0,4) , (1,2) …vậy ạ. Em đọc tiếng anh còn kém lắm mong mọi người giải đáp giúp
A non-empty array A of N integers is given. A pair of integers (P, Q), such that 0 ≤ P ≤ Q < N, is called a slice of array A. The sum of a slice (P, Q) is the total of A[P] + A[P+1] + … + A[Q].

A min abs slice is a slice whose absolute sum is minimal.

For example, array A such that:

A[0] = 2
A[1] = -4
A[2] = 6
A[3] = -3
A[4] = 9
contains the following slices, among others:

(0, 1), whose absolute sum = |2 + (−4)| = 2
(0, 2), whose absolute sum = |2 + (−4) + 6| = 4
(0, 3), whose absolute sum = |2 + (−4) + 6 + (−3)| = 1
(1, 3), whose absolute sum = |(−4) + 6 + (−3)| = 1
(1, 4), whose absolute sum = |(−4) + 6 + (−3) + 9| = 8
(4, 4), whose absolute sum = |9| = 9
Both slices (0, 3) and (1, 3) are min abs slices and their absolute sum equals 1.

Write a function:

class Solution { public int solution(int[] A); }

that, given a non-empty array A consisting of N integers, returns the absolute sum of min abs slice.

For example, given:

A[0] = 2
A[1] = -4
A[2] = 6
A[3] = -3
A[4] = 9
the function should return 1, as explained above.

Assume that:

N is an integer within the range [1…100,000];
each element of array A is an integer within the range [−10,000…10,000].
Complexity:

expected worst-case time complexity is O(N*log(N));
expected worst-case space complexity is O(N) (not counting the storage required for input arguments).

Nguyễn Đình Anh viết 18:53 ngày 01/10/2018

ko có cặp (0,4) , (1,2) …vậy ạ.

Họ chỉ đưa ra một số slice thôi, chứ không đưa ra tất cả ở VD Dịch đơn giản đề ra thì là tìm Giá trị tuyệt đối là bé nhất của tổng các số liên tiếp thôi

rogp10 viết 18:54 ngày 01/10/2018

“Giá trị tuyệt đối là bé nhất” chứ

Nguyễn Đình Anh viết 18:49 ngày 01/10/2018

Thảm nào cứ thắc mắc abs là gì, giờ mới nhớ ra là trị tuyệt đối

mmmm viết 18:55 ngày 01/10/2018

làm 2 vòng lặp thì độ phức tạp bao nhiêu vậy ạ, trong trường mình ko dạy kĩ cái này nên giờ cũng ko biết tính

rogp10 viết 18:51 ngày 01/10/2018

Chạy hết mảng mà 2 vòng lồng nhau thì nhiều khi là O(N^2).

mmmm viết 18:43 ngày 01/10/2018

vậy là ko đáp ứng được performance bài này rồi

Gió viết 18:56 ngày 01/10/2018

Đây là cách giải của mình:

  1. Xây dựng mảng cộng dồn s[i] = sum(a[0:i])
  2. sum(a[p]+a[p+1]+…+a[q]) = s[q+1] - s[p]
  3. Từ bước 2 ta thấy là tất cả các đoạn đều có thể tính từ mảng s, mặt khác nếu abs(sum(a[p]+a[p+1]+…+a[q]) ) nhỏ nhất tức là abs(s[q+1] - s[p]) nhỏ nhất hay s[q+1] - s[p] gần 0 nhất
  4. Ta chỉ cần sort mảng s để tìm s[q+1] - s[p] gần nhau nhất
  5. kết quả = min(sorted_s[i+1] - sorted_s[i])

[details=python]```py

a = [2,-4,6,-3,9]
s = [0]

for w in a:
s.append(s[-1]+w)

s.sort()
ans = float(“inf”)
for i in range(len(s)-1):
ans = min(s[i+1]-s[i],ans)
print(ans)

[/details]
mmmm viết 18:41 ngày 01/10/2018

nhỏ nhất hay s[q+1] - s[p] gần 0 nhất

anh gió giải thích em chỗ này với ạ, các phần tử cộng dồn âm dương đâu biết chính xác sao anh xác định chỗ đó gần 0 nhất v. em chưa biết python, trường em dạy mỗi java thôi

Hung viết 18:53 ngày 01/10/2018

Chuyển sang Java nè, nhưng có vẻ không đúng convention lắm.

Code ```java import java.util.Arrays;

public class Main {
public static void main(String[] args) {
int[] numbers = { 2, -4, 6, -3, 9 };

    int[] sum = new int[numbers.length];
    sum[0] = numbers[0];
    for (int i = 1; i < numbers.length; i++) {
        sum[i] = sum[i - 1] + numbers[i];
    }

    Arrays.sort(sum);

    int minDiff = Math.abs(sum[0]);
    for (int i = 1; i < sum.length; i++) {
        minDiff = Math.min(minDiff, sum[i] - sum[i - 1]);
        minDiff = Math.min(minDiff, Math.abs(sum[i]));
    }

    System.out.println("Min: " + minDiff);
}

}

</details>
Gió viết 18:56 ngày 01/10/2018

Để giải thích cho bước 3: abs(s[q+1] - s[p]) nhỏ nhất
biểu diễn trên trục tọa độ Ox, abs(a-b) = khoảng cách trên trục tọa độ của 2 điểm a,b
Cố định điểm a, khoảng cách từ a đến các điểm khác nhỏ nhất khi điểm đó gần a nhất

-----------------a----b-----x—y---z------------>

Như vậy đáp số bài toán là khoảng cách nhỏ nhất của 2 điểm liền kề

Giải thích bước 4: sắp xếp lại thứ tự các điểm của mảng s để được các cặp điểm gần nhau

Bài liên quan
0