当前位置: 首页 > 编程笔记 >

程序在C ++中单次反转后查找最大相邻绝对值总和

水渊
2023-03-14
本文向大家介绍程序在C ++中单次反转后查找最大相邻绝对值总和,包括了程序在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

  • 回答:= 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

 类似资料:
  • 本文向大家介绍C#程序查找三个数字中的最大值,包括了C#程序查找三个数字中的最大值的使用技巧和注意事项,需要的朋友参考一下 首先,让我们设置三个数字- 现在检查第一个数字和第二个数字。如果num1> num2,则用num3检查num1。如果num1大于num3,则表示最大数量为num1。 示例 您可以尝试运行以下代码来查找三个数字的最大值。 输出结果

  • 我已经编写了一个程序,找到一个包含“customer:”的单元格,并且程序成功地工作。问题是,我想要直接挨着单元格的单元格的值。布局如下所示:

  • 本文向大家介绍在C ++中生成相同总和的对的最大数量,包括了在C ++中生成相同总和的对的最大数量的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目的是在数组中找到最大对数,相加后将产生相同的总和。我们必须找到此类对的最大数量。 输入值 输出结果 说明-数字对的总和- 输入值 输出结果 说明-数字对的总和- 以下程序中使用的方法如下 整数数组Arr []用于存储整数。 整数“大小”存

  • 问题内容: 如何在Java 8的以下列表中找到最大,最小,和和平均值? 问题答案: 有一个班级名称, 例如: 输出: 希望能帮助到你 了解有关IntSummaryStatistics的信息

  • 本文向大家介绍C ++程序查找数组中最近的点对,包括了C ++程序查找数组中最近的点对的使用技巧和注意事项,需要的朋友参考一下 这是在数组中查找最接近的点对的程序。 演算法 对于最近点之间的距离 要计算最小距离- 示例 输出结果