数学-绝对值-Reverse Subarray To Maximize Array Value
2020-02-11 12:01:21
问题描述:

问题求解:
本题的难度个人感觉还是蛮大的,主要是不容易想到O(n)的解。
对于 ...a, [b, ... , c], d, ...,如果我们将其中的[b, ... , c]进行翻转。
如果两线段有重复,必减小原先的值。
如果两线段无重复,必增加原先的值,且diff为2 * gap。
可通过如下的图进行分类讨论。

最后,再对边界做一个处理即可。
int inf = (int)1e9;
public int maxValueAfterReverse(int[] nums) {
int res = 0;
int n = nums.length;
int diff = 0;
for (int i = 0; i < n - 1; i++) res += Math.abs(nums[i + 1] - nums[i]);
// 端点不在两顶点
int min = inf;
int max = -inf;
for (int i = 0; i <= n - 2; i++) {
min = Math.min(min, Math.max(nums[i], nums[i + 1]));
max = Math.max(max, Math.min(nums[i], nums[i + 1]));
}
diff = Math.max(diff, 2 * (max - min));
// 一端点在左顶点
for (int i = 1; i <= n - 2; i++) {
diff = Math.max(diff, Math.abs(nums[i + 1] - nums[0]) - Math.abs(nums[i + 1] - nums[i]));
}
// 一端点在右顶点
for (int i = 1; i <= n - 2; i++) {
diff = Math.max(diff, Math.abs(nums[i - 1] - nums[n - 1]) - Math.abs(nums[i - 1] - nums[i]));
}
return res + diff;
}

浙公网安备 33010602011771号