AVL树:左子树和右子树的高度差不超过一;
红黑树:根节点是黑的,叶子节点也是黑的,不能有两个连续的红,最长和最短不超过两倍;
一个数组中有正有负有零,给定一个目标值,求最长子数组的长度
算法思路:当前位置的和减去目标值,得到一个值,此时这个值所在的位置到当前位置的长度,为答案
算法流程:
初始化map,map.put(0,-1),不用算也为0;
计算sum-target的值,是否包含在map中,如果在,那么获取长度。
判断sum是否在map中,如果不在则添加,那么map.put(sum,i);
public static int maxLength(int[] arr, int aim) {Map<Integer, Integer> map = new HashMap<>();map.put(0, -1);int sum = 0;int len = 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;}
一个数组中有奇数和偶数,求奇数和偶数相等的最长子数组
算法思路:
将奇数变为-1,偶数变1,求目标值为0的,最长子数组。
一个数组中有0,1,2,求1,2相等的最长子数组
算法思路:
将2变为-1,求目标值为0的最长子数组
给定一个数组arr,可以将arr分为很多不相容的子数组,求分出来的子数组中,包含最多的异或和为0的子数组。
算法思路:
利用dp求解,dp[i] = dp[i-1]或者dp[pre] + 1,求最大的;当前位置i的值,要么不能组成0,要么能和前面的组成0;
算法流程:
1.初始化map,map.put(0,-1),map中存放的是xor的值和位置。
2.设置一个dp数组,存放的是以当前位置结尾的最长子数组
3.设置一个变量xor,保存从头到尾的xor变化
4.如果map里存在xor,那么说明我与之前位置的xor相等,说明了从之前的位置到当前位置的异或为0;0异或任意数都为0;
public static int maxLength(int[] arr, int aim) {Map<Integer, Integer> map = new HashMap<>();map.put(0, -1);int[] dp = new int[arr.length];int xor = 0;int res = 0;for (int i=0;i<arr.length;i++){xor ^= arr[i];if(map.containsKey(xor)){int pre = map.get(xor); 存在说明,要+1;dp[i] = pre==-1?1:(dp[pre]+1);}if(i>0){dp[i] = Math.max(dp[i],dp[i-1]);}map.put(xor,i);res = Math.max(res,dp[i]);}return res;