1.最简单的暴力方法,三层遍历,外面两层分别确定子数组的头和尾,最内的一层为相加的操作
2.利用数组前缀和(对数组进行累加,维护出一个代表数组前缀和的数组),然后就类似方法1,确定头尾,只不过是省去了相加的操作,直接相减就可算出和
3.利用map进行前缀和、当前数组的尾坐标的存储,从尾到头的遍历前缀和数组。直接从map中取出sum【i】-target的值,即可快速的确定出数组的头尾。
public class test {
public int maxSubArrayLen(int[] nums, int k){
int maxLen = 0;
int[] sum = new int[nums.length+1];
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0,0);
for(int i = 1; i <= nums.length; i++){
sum[i] = sum[i-1] + nums[i-1];
if(!map.containsKey(sum[i])){
map.put(sum[i], i);
}
}
for(int i = sum.length-1; i >= 0; i--){
if(map.containsKey(sum[i] - k)){
maxLen = Math.max(maxLen, i - map.get(sum[i] - k));
}
}
return maxLen;
}
}