C++程序:查找单次反转后最大相邻绝对值之和
假设我们有一个名为nums的数字列表,我们最多可以反转列表中的任何子列表一次。执行此操作后,我们必须找到以下最大可能值:
$\displaystyle\sum\limits_{i=0}^{n-2}| nums[i+1]-[nums[i]|$
因此,如果输入类似于nums = [2, 4, 6],则输出将为6,因为当我们反转[4, 6]时,我们将得到列表[2, 6, 4],而值|2 − 6| + |6 − 4| = 6
为了解决这个问题,我们将遵循以下步骤:
如果nums的大小<= 1,则:
返回0
ans := 0
n := nums的大小
对于初始化i := 1,当i < n时,更新(i增加1),执行:
ans := ans + |nums[i] − nums[i − 1]|
orig := ans
对于初始化i := 1,当i < n − 1时,更新(i增加1),执行:
ans := ans和orig − |(nums[i] − nums[i + 1]| + |nums[0] − nums[i + 1]| 的最大值
ans := ans和orig − |(nums[i] − nums[i − 1]| + |nums[n − 1] − nums[i − 1]| 的最大值
pp := −|nums[1] − nums[0]|
pm := −|nums[1] − nums[0]|
mp := −|nums[1] − nums[0]|
mm := −|nums[1] − nums[0]|
对于初始化j := 2,当j < n − 1时,更新(j增加1),执行:
jerror := |nums[j + 1] − nums[j]|
ans := ans和(orig + pp − jerror − nums[j] − nums[j + 1])的最大值
ans := ans和(orig + pm − jerror − nums[j] + nums[j + 1])的最大值
ans := ans和(orig + mp − jerror + nums[j] − nums[j + 1])的最大值
ans := ans和(orig + mm − jerror + nums[j] + nums[j + 1])的最大值
pp := pp和−|nums[j] − nums[j − 1]| 的最大值
pm := pm和−|nums[j] − nums[j − 1]| 的最大值
mp := mp和−|nums[j] − nums[j − 1]| 的最大值
mm := mm和−|nums[j] − nums[j − 1]| 的最大值
返回ans
让我们看看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
int solve(vector<int>& nums) {
if (nums.size() <= 1)
return 0;
int ans = 0;
int n = nums.size();
for (int i = 1; i < n; i++) {
ans += abs(nums[i] − nums[i − 1]);
}
int orig = ans;
for (int i = 1; i < n − 1; i++) {
ans = max(ans, orig − abs(nums[i] − nums[i + 1]) +
abs(nums[0] − nums[i + 1]));
ans = max(ans, orig − abs(nums[i] − nums[i − 1]) + abs(nums[n
− 1] − nums[i − 1]));
}
int pp = −abs(nums[1] − nums[0]) + nums[0] + nums[1];
int pm = −abs(nums[1] − nums[0]) + nums[0] − nums[1];
int mp = −abs(nums[1] − nums[0]) − nums[0] + nums[1];
int mm = −abs(nums[1] − nums[0]) − nums[0] − nums[1];
for (int j = 2; j < n − 1; j++) {
int jerror = abs(nums[j + 1] − nums[j]);
ans = max(ans, orig + pp − jerror − nums[j] − nums[j + 1]);
ans = max(ans, orig + pm − jerror − nums[j] + nums[j + 1]);
ans = max(ans, orig + mp − jerror + nums[j] − nums[j + 1]);
ans = max(ans, orig + mm − jerror + nums[j] + nums[j + 1]);
pp = max(pp, −abs(nums[j] − nums[j − 1]) + nums[j − 1] +
nums[j]);
pm = max(pm, −abs(nums[j] − nums[j − 1]) + nums[j − 1] −
nums[j]);
mp = max(mp, −abs(nums[j] − nums[j − 1]) − nums[j − 1] +
nums[j]);
mm = max(mm, −abs(nums[j] − nums[j − 1]) − nums[j − 1] −
nums[j]);
}
return ans;
}
int main(){
vector<int> v = {2, 4, 6};
cout << solve(v);
}输入
{2, 4, 6}输出
6
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP