使用C++解决这个题目:1330. 翻转子数组得到最大的数组值 提示 困难 164 相关企业 给你一个整数数组 nums 。「数组值」定义为所有满足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。 你可以选择给定数组的任意子数组,并将该子数组翻转。但你只能执行这个操作 一次 。 请你找到可行的最大 数组值 。 示例 1: 输入:nums = [2,3,1,5,4] 输出:10 解释:通过翻转子数组 [3,1,5] ,数组变成 [2,5,1,3,4] ,数组值为 10 。 示例 2: 输入:nums = [2,4,9,24,2,1,10] 输出:68 提示: 1 <= nums.length <= 3*10^4 -10^5 <= nums[i] <= 10^5
时间: 2024-01-20 18:03:45 浏览: 122
以下是使用C++解决该题的代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int maxDiff = 0;
int curDiff = 0;
int maxLeft = 0, maxRight = 0;
int curLeft = 0;
for (int i = 1; i < n; i++) {
int diff = abs(nums[i] - nums[i - 1]);
if (curDiff + diff < diff) {
curDiff = diff;
curLeft = i - 1;
} else {
curDiff += diff;
}
if (curDiff > maxDiff) {
maxDiff = curDiff;
maxLeft = curLeft;
maxRight = i;
}
}
reverse(nums.begin() + maxLeft, nums.begin() + maxRight);
int ans = 0;
for (int i = 1; i < n; i++) {
ans += abs(nums[i] - nums[i - 1]);
}
cout << ans << endl;
return 0;
}
```
首先读入数组,然后遍历数组计算相邻两个数的差的绝对值之和,同时记录下当前最大的差和最大差所在子数组的左右下标。最后将最大差所在子数组翻转,重新计算数组值并输出即可。
阅读全文