📌  相关文章
📜  | arr [0] – arr [1] |的最大值+ | arr [1] – arr [2] | +…+ | arr [n – 2] – arr [n – 1] |当元素从1到n(1)

📅  最后修改于: 2023-12-03 15:06:08.722000             🧑  作者: Mango

介绍题目

这道题目的主题是求一个长度为n的数组中每相邻两个元素之差的绝对值的和的最大值。换句话说,求最大的相邻元素之差的绝对值和。

解题思路

假设数组 arr 的长度为 n,则可以考虑从数组的第二个元素开始依次计算相邻元素之差的绝对值,将其累加起来即可。代码如下:

int maxAbsoluteSum(vector<int>& arr) {
    int n = arr.size();
    int res = 0, maxDiff = abs(arr[0] - arr[1]);
    for (int i = 1; i < n; i++) {
        res += abs(arr[i] - arr[i-1]);
        maxDiff = max(maxDiff, abs(arr[i] - arr[i-1]));
    }
    return res - maxDiff;
}

其中,变量 res 用于记录相邻元素之差的绝对值的和,变量 maxDiff 用于记录相邻元素之差的最大值。在每次更新 res 的同时,判断当前相邻元素之差的绝对值是否大于 maxDiff,如果是,则更新 maxDiff。最后,返回 res - maxDiff 即可。

时间复杂度

由于只需要遍历一次数组,因此时间复杂度为 O(n)。

空间复杂度

由于只需要常数级别的额外空间来存储变量,因此空间复杂度为 O(1)。

完整代码

int maxAbsoluteSum(vector<int>& arr) {
    int n = arr.size();
    int res = 0, maxDiff = abs(arr[0] - arr[1]);
    for (int i = 1; i < n; i++) {
        res += abs(arr[i] - arr[i-1]);
        maxDiff = max(maxDiff, abs(arr[i] - arr[i-1]));
    }
    return res - maxDiff;
}