1131. 绝对值表达式的最大值

1131. 绝对值表达式的最大值

  • 原题链接:
  • 完成情况:
  • 解题思路:
    • 求方向
    • 一次遍历两度统计
  • 参考代码:
    • 求方向
    • 一次遍历两度统计

原题链接:

1131. 绝对值表达式的最大值

https://leetcode.cn/problems/maximum-of-absolute-value-expression/description/

完成情况:

1131. 绝对值表达式的最大值_第1张图片

解题思路:

求方向

1131. 绝对值表达式的最大值_第2张图片

一次遍历两度统计

1131. 绝对值表达式的最大值_第3张图片
1131. 绝对值表达式的最大值_第4张图片
1131. 绝对值表达式的最大值_第5张图片

参考代码:

求方向

package 西湖算法题解___中等题02;

public class __1131绝对值表达式的最大值__计算曼哈顿距离__求方向导数 {
	int [][] dirs = {{1,1,1},{-1,1,1},{-1,-1,1},{1,-1,1},{1,1,-1},{-1,1,-1},{-1,-1,-1},{1,-1,-1}};  //定义出八种abs拆解情况
	/**
	 *
	 * @param arr1
	 * @param arr2
	 * @return
	 */
	public int maxAbsValExpr(int[] arr1, int[] arr2) {
		int maxValue = 0;
		int n = arr1.length;
		for (int [] dir:dirs){  //选择其中的某一个方向
			//定义最大值,最小值出来,进行方向判断的赋值
			int maxPoint = Integer.MIN_VALUE,minPoint  = Integer.MAX_VALUE;
			for (int i=0;i<n;i++){  //八个方向全部去进行统计,然后得出在某点出会得到的最大值
				maxPoint = Math.max(maxPoint,arr1[i]*dir[0] + arr2[i]*dir[1] + i*dir[2]);
				minPoint = Math.min(minPoint,arr1[i]*dir[0] + arr2[i]*dir[1] + i*dir[2]);
			}
			maxValue = Math.max(maxValue,maxPoint-minPoint);
			//每个方向都去进行最大值的判断
		}
		return maxValue;
	}
}

一次遍历两度统计

package 西湖算法题解___中等题02;

public class __1131绝对值表达式的最大值__计算曼哈顿距离__一次遍历两度统计 {
	/**
	 通过拆解绝对值,然后去计算每一个点的情况,
	    即处于该点时,arr1[i]、arr2[i]、i三者任意拼接构成的最小值,最大值的情况

	 * @param arr1
	 * @param arr2
	 * @return
	 */
	public int maxAbsValExpr(int[] arr1, int[] arr2) {
		//一次遍历,用两个最大值max去进行统计。
		int aMin = Integer.MAX_VALUE,bMin = Integer.MAX_VALUE,cMin = Integer.MAX_VALUE,dMin = Integer.MAX_VALUE;
		int aMax = Integer.MIN_VALUE,bMax = Integer.MIN_VALUE,cMax = Integer.MIN_VALUE,dMax = Integer.MIN_VALUE;

		for (int i = 0;i< arr1.length;i++){ //同长度,一次遍历两度统计
			aMin = Math.min(aMin,arr1[i] + arr2[i]+i);
			aMax = Math.max(aMax,arr1[i] + arr2[i]+i);

			bMin = Math.min(bMin,arr1[i] + arr2[i]-i);
			bMax = Math.max(bMax,arr1[i] + arr2[i]-i);

			cMin = Math.min(cMin,arr1[i] - arr2[i]+i);
			cMax = Math.max(cMax,arr1[i] - arr2[i]+i);

			dMin = Math.min(dMin,arr1[i] - arr2[i]-i);
			dMax = Math.max(dMax,arr1[i] - arr2[i]-i);
		}
		return Math.max(Math.max((aMax - aMin),(bMax-bMin)),Math.max((cMax - cMin),(dMax-dMin)));
	}
}

你可能感兴趣的:(算法知识,#,LeetCode题解,java学习,java,leetcode,算法,数据结构,曼哈顿距离)