异或
E1,E2,E3为二进制串
条件:E1^E2=E3
结论:E1=E3^E2,
E2=E3^E1
累加和为目标值的最长子数组
//利用哈希map
package cao;
import java.util.*;
public class hello {
public static int maxlength(int[] arr,int aim){
int len=0;//全局最大值
int sum=0;//计算和
HashMap<Integer,Integer> map=new HashMap<Integer, Integer>();
if(arr==null||arr.length==0){
return 0;
}
map.put(0,-1);//-1位置最大长度是0
for(int i=0;i<arr.length;i++){
sum+=arr[i];
if(map.containsKey(sum-aim)){
len=Math.max(i-map.get(sum-aim),len);
}
if(!map.containsKey(sum)){
map.put(sum,i);
}
}
return len;
}
public static void main(String[] args) {
int[] build={7,3,2,1,1,7};
int res=maxlength(build,7);
System.out.println(res);
}
}
结果:4
类似题目:奇数个数等于偶数个数的最长子数组、只含有0,1,2的数组中1的个数等于2的个数的最长子数组
题目1
给定一个数组,值全是正数,请返回累加和为给定值aim的最长子数组长度。要求额外空间复杂度o(1),时间复杂度o(N)
思路:双指针,定义两个指针左,右,当sum<k时,右指针向右移动,len++;当sum>=k时,左指针右移,直到右指针到最后
public static int getMaxLength(int[] arr,int k){
if (arr == null || arr.length == 0) {
return 0;
}
//定义左右指针
int left=0;
int right=0;
//记录数组和
int sum=arr[0];
//记录最大长度
int len=0;
while (right < arr.length) {
if (sum == k) {
len=Math.max(len,right-left+1);
sum-=arr[left++];
} else if (sum < k) {
right++;
if (right == arr.length) {
break;
}
sum+=arr[right];
}else {
sum-=arr[left++];
}
}
return len;
}