Cho mảng số nguyên, tìm độ dài mảng con (subarray) liên tiếp dài nhất có tổng bằng 0. Nếu không có, trả về 0. Ví dụ:
Đầu vào 1: {15, -5, -1, 5, 1, 4} → Đầu ra: 4 (mảng con {-5,-1,5,1}).
Đầu vào 2: {3, 2, 4, 8, -1} → Đầu ra: 0.
Phương pháp: Hashmap lưu tổng tiền tố
- Duyệt mảng, tính tổng tiền tố
sum. - Dùng
unordered_map<int,int>lưusum -> chỉ số đầu tiên xuất hiện. - Nếu
sum == 0→ cập nhậtmaxlen = i+1. - Nếu
sumđã có trong map → mảng con từmap[sum]+1đếnicó tổng 0, độ dàii - map[sum]. Cập nhật maxlen. - Nếu
sumchưa có → lưu vào map.
Ví dụ mã nguồn
#include <bits/stdc++.h>
using namespace std;
int lenMax(int *arr, int size) {
unordered_map<int,int> mp;
int sum = 0, maxlen = 0;
for (int i=0;i
Kết quả
5
Phức tạp O(n) thời gian, O(n) không gian.