【题目】
给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr中所有的子数组中累加和为k的最长子数组长度。
【补充题目】
给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr中所有的子数组中正数与负数个数相等的最长子数组长度。
【补充题目】
给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr中所有的子数组中0与1个数相等的最长子数组长度。
【代码】
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,3};
System.out.println(maxL(arr,6));//3
}
//未排序数组中累加和为给定值的最长子数组系列问题
public static int maxL(int[] arr,int k){
if(arr==null || arr.length==0){
return 0;
}
int sum=0;
int len=0;
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
//key:从arr最左边开始累加过程中出现过的sum值
//value:sum值最早出现的位置
map.put(0, -1);//重要,表示:当累加和为0的时候,一个元素也没有
for(int i=0;i<arr.length;i++){
sum+=arr[i];
if(map.containsKey(sum-k)){
//arr[j..i]的累加和为:s(i)-s(j-1)
len=Math.max(len, i-map.get(sum-k));
}
if(!map.containsKey(sum)){
map.put(sum, i);
}
}
return len;
}
【说明】
补充问题解法:
1.把arr中正数变为1,负数变为-1,0不变,求累加和为0的最长子数组。
2.把arr中0变为-1,1不变,求累加和为0的最长子数组。
本文探讨了给定数组中寻找特定子数组的问题,包括累加和等于给定值、正负数数量相等及0与1数量相等情况的最长子数组长度计算方法,并提供了具体的实现代码。
5万+

被折叠的 条评论
为什么被折叠?



