本文共 1908 字,大约阅读时间需要 6 分钟。
为了找到数组中所有和为0的子数组,可以使用哈希表来记录前缀和及其对应的索引位置。这种方法的时间复杂度是O(n),非常高效。以下是详细的步骤解释:
import java.util.HashMap;import java.util.ArrayList;import java.util.List;public class FindZeroSumSubarrays { public ListfindZeroSumSubarrays(int[] nums) { List result = new ArrayList<>(); HashMap > map = new HashMap<>(); map.put(0, new ArrayList<>()); int[] prefixSums = new int[nums.length + 1]; prefixSums[0] = 0; for (int i = 0; i < nums.length; i++) { prefixSums[i+1] = prefixSums[i] + nums[i]; if (map.containsKey(prefixSums[i+1])) { List indices = map.get(prefixSums[i+1]); for (int idx : indices) { int start = idx + 1; int end = i; int[] sub = new int[end - start + 1]; for (int j = start; j <= end; j++) { sub[j - start] = nums[j]; } result.add(sub); } } if (!map.containsKey(prefixSums[i+1])) { List indices = new ArrayList<>(); indices.add(i); map.put(prefixSums[i+1], indices); } else { List indices = map.get(prefixSums[i+1]); indices.add(i); map.put(prefixSums[i+1], indices); } } return result; } }
map
初始化时存入前缀和0对应的索引-1。prefixSums
用于存储从数组开始到当前位置的所有前缀和。这种方法利用哈希表的高效查找特性,在O(n)的时间复杂度内解决问题,适用于处理大规模数组。
转载地址:http://qzfwk.baihongyu.com/