当前位置: 代码迷 >> 综合 >> 算法进阶(第四天)
  详细解决方案

算法进阶(第四天)

热度:43   发布时间:2024-02-01 04:49:14.0

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;

 

  相关解决方案