给定一个无序数组 arr , 其中元素可正、可负、可0。给定一个整数 k ,求 arr 所有连续子数组中累加和为k的最长连续子数组长度。保证至少存在一个合法的连续子数组。
[1,2,3]的连续子数组有[1,2],[2,3],[1,2,3] ,但是[1,3]不是
数据范围: ,,
要求:空间复杂度 , 时间复杂度
要求:空间复杂度 , 时间复杂度
[1,-2,1,1,1],0
3
[0,1,2,3],3
3
import java.util.*; public class Solution { /** * max length of the subarray sum = k * @param arr int整型一维数组 the array * @param k int整型 target * @return int整型 */ public int maxlenEqualK (int[] nums, int k) { //连续子数组问题 //前缀和 int n=nums.length; Map<Integer,Integer> map=new HashMap<>(); int[]pre=new int[n+1]; for(int i=1;i<=n;i++) pre[i]=pre[i-1]+nums[i-1]; // a-b=k map.put(0,0); int res=1; for(int i=1;i<=n;i++){ if(map.containsKey(pre[i]-k)){ int j=map.get(pre[i]-k); res=Math.max(res,i-j);//i表示个数 } if(!map.containsKey(pre[i])) map.put(pre[i],i); } return res; } }
public int maxlenEqualK (int[] arr, int k) { if(arr==null||arr.length==0) return 0; int sum=0;//记录从开头到第i个位置的总和 HashMap<Integer,Integer>map=new HashMap<>();//记录每一个sum以及它出现的位置 //基本思想是:如果第i个位置总和为a,第j个位置总和为b,那么在j位置时若发现b-a=k,则a-b之间就是总和为k的子数组 map.put(0,-1);//初始化总和为0出现的位置 int len=0;//最大长度 for(int i=0;i<arr.length;i++){ sum+=arr[i]; if(map.containsKey(sum-k)) len=Math.max(len,i-map.get(sum-k)); if(!map.containsKey(sum)) map.put(sum,i); } return len; }
public class Solution { public int maxlenEqualK (int[] arr, int k) { // 前缀和 + 哈希表登记 int res = 0; int preSum = 0; Map<Integer, Integer> cache = new HashMap<>(); for (int i = 0; i < arr.length; i++) { preSum += arr[i]; if (preSum == k) { res = Math.max(res, i + 1); } if (cache.containsKey(preSum - k)) { res = Math.max(res, i - cache.get(preSum - k)); } if (!cache.containsKey(preSum)) { cache.put(preSum, i); } } return res; } }
public class Solution { /** * max length of the subarray sum = k * @param arr int整型一维数组 the array * @param k int整型 target * @return int整型 */ public int maxlenEqualK (int[] arr, int k) { // write code here if(arr == null){return 0;} int len = arr.length; int res = 0; int sum = 0; Map<Integer, Integer> map = new HashMap<>(); map.put(0, -1); // 下标-1对应的和为0; for(int i = 0; i < len; ++i){ sum += arr[i]; int delta = sum - k; if(map.containsKey(delta)){ res = Math.max(res, i - map.get(delta)); } if(!map.containsKey(sum)){ map.put(sum, i); // 当map不存在delta时才将sum->i插入哈希表。 } } return res; } }
public int maxlenEqualK (int[] arr, int k) { int sum=0; int count=0; for(int j=0;j<arr.length;j++) { sum=0; int tmp=0; for(int i=j;i<arr.length;i++) { sum+=arr[i]; tmp++; if(sum==k) { if(count<tmp) count=tmp; } } if(count>arr.length-j) break; } return count; }
import java.util.*; public class Solution { /** * max length of the subarray sum = k * @param arr int整型一维数组 the array * @param k int整型 target * @return int整型 */ public int maxlenEqualK (int[] arr, int k) { // write code here int len = Integer.MIN_VALUE; int sum = 0; Map<Integer, Integer> map = new HashMap<>(); map.put(0, -1);// 处理边界值 // arr[i + 1, ..., j] = k for (int i = 0; i < arr.length; i++) { sum += arr[i]; // 只记录第一次的位置,因为要求最长数组 if (!map.containsKey(sum)) { map.put(sum, i); } // 判断是否需要更新len if(map.containsKey(sum - k) && i - map.get(sum - k) > len){ len = i - map.get(sum - k); } } return len; } }