1330.翻转子数组得到最大的数组值
链接:1330.翻转子数组得到最大的数组值
难度:Hard
标签:贪心、数组、数学
简介:给你一个整数数组 nums 。「数组值」定义为所有满足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。
题解 1 - cpp
- 编辑时间:2023-05-12
- 执行用时:84ms
- 内存消耗:39.3MB
- 编程语言:cpp
- 解法介绍:https://leetcode.cn/problems/reverse-subarray-to-maximize-array-value/solution/bu-hui-hua-jian-qing-kan-zhe-pythonjavac-c2s6/。
class Solution {
public:
    int maxValueAfterReverse(vector<int>& nums) {
        int n = nums.size(), sums = 0, nmax = INT_MIN, nmin = INT_MAX, val = 0;
        for (int i = 1; i < n; i++) {
            int num = abs(nums[i] - nums[i - 1]);
            sums += num;
            nmax = max(nmax, min(nums[i], nums[i - 1]));
            nmin = min(nmin, max(nums[i], nums[i - 1]));
            val = max(val, max(abs(nums[i] - nums[0]), abs(nums[i - 1] - nums[n - 1])) - num);
        }
        return sums + max(val, 2 * (nmax - nmin));
    }
};
题解 2 - python
- 编辑时间:2023-05-12
- 执行用时:328ms
- 内存消耗:19.6MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def maxValueAfterReverse(self, nums: List[int]) -> int:
    n = len(nums)
    sums = 0
    nmax = -inf
    nmin = inf
    val = 0
    for i in range(1, n):
        num = abs(nums[i] - nums[i - 1])
        sums += num
        nmax = max(nmax, min(nums[i], nums[i - 1]))
        nmin = min(nmin, max(nums[i], nums[i - 1]))
        val = max(val, max(abs(nums[i] - nums[0]), abs(nums[i - 1] - nums[n - 1])) - num)
    return sums + max(val, 2 * (nmax - nmin))
题解 3 - rust
- 编辑时间:2023-05-12
- 执行用时:8ms
- 内存消耗:2.3MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
    pub fn max_value_after_reverse(nums: Vec<i32>) -> i32 {
        use std::cmp::{max, min};
        let n = nums.len();
        let mut sums = 0;
        let mut nmax = i32::MIN;
        let mut nmin = i32::MAX;
        let mut val = 0;
        for i in 1..n {
            let num = (nums[i] - nums[i - 1]).abs();
            sums += num;
            nmax = max(nmax, min(nums[i], nums[i - 1]));
            nmin = min(nmin, max(nums[i], nums[i - 1]));
            val = max(
                val,
                max((nums[i] - nums[0]).abs(), (nums[i - 1] - nums[n - 1]).abs()) - num,
            );
        }
        sums + max(val, 2 * (nmax - nmin))
    }
}