其实这个题我是有思路的,我一开始想的是,我用A B表示最大的两个数,用a b表示最小的两个数,可能分布为
A B a b
A a b B
A a B b
然后每个挨着从哪儿反转有四种情况,但是这么列没讨论具体哪个是最大哪个是最小,就是12种。然后我在那儿画图举例子给自己整蒙圈了。好像又回到了当年,有想法,但是实现有问题。我还在那儿寻思我写12个条件判断挺多了,条件判断里边再套条件判断就乱套了。
看了看别人的,实际上应该是24中,直接全排列A B a b的大小关系和位置,就是4!=24。然后每种情况算翻转前和翻转后的差,把它从带绝对值转为不带绝对值。然后就会发现多了的每次都是2倍的第二大减第二小,应该纯数学公式也能推,但是我不会。然后再单独讨论一下边界情况就可以了。
class Solution {
public:
int maxValueAfterReverse(vector<int>& nums) {
int sum = 0;
int maxx = INT_MIN;
int minn = INT_MAX;
int x, y, d, d1, d2;
d1 = d2 = INT_MIN;
for(int i = 1; i < nums.size(); i ++){
x = nums[i-1];
y = nums[i];
maxx = max(maxx, min(x, y));
minn = min(minn, max(x, y));
d = abs(y - x);
sum += d;
d1 = max(d1, (abs(nums[0] - nums[i]) - abs(nums[i-1] - nums[i])));
d2 = max(d1, (abs(nums[i] - nums[nums.size()-1]) - abs(nums[i] - nums[i-1])));
}
return max(2* (maxx - minn), max(d1, d2)) + sum;
}
};