Ta tính mảng tổng \(S[i]\) là tổng từ \(A[1]\) đến \(A[i]\), \(S[0] = 0\). Sau đó sắp xếp lại mảng
\(S\) tăng dần (có lưu lại chỉ số ban đầu của phần tử).
Lần lượt duyệt các phần tử trong mảng đã sắp lại. Ở \(S[i]\), vì đề yêu cầu tổng của dãy con phải không nhỏ
hơn \(p\) nên ta cần tìm \(j\) lớn nhất thỏa \(S[i]-S[j]\geq p\). Khi đó dãy con dài nhất tại \(S[i]\) là
\(I[i]-min\{I[k] \mid 0 \leq k \leq j\}\), \(I\) là mảng chỉ số ban đầu của các phần tử trong dãy \(S\).
Để tìm \(j\), có thể sử dụng tìm kiếm nhị phân, cho độ phức tạp của lời giải là \(O(N \log N)\).
Tuy nhiên, do ta duyệt \(i\) tăng dần nên \(j\) cũng sẽ tăng dần theo \(i\) Từ đó có cách làm
\(O(N)\) như bên dưới, tại mỗi bước ta tăng \(j\) trong khi điều kiện \(S[i]-S[j]\geq p\) còn thỏa.