欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 面试算法题精讲:求数组两组数差值和的最大值

面试算法题精讲:求数组两组数差值和的最大值

2024/11/29 13:19:58 来源:https://blog.csdn.net/ProgramNovice/article/details/142372435  浏览:    关键词:面试算法题精讲:求数组两组数差值和的最大值

面试算法题精讲:求数组两组数差值和的最大值

题目描述

给定一个数组 nums,求 (nums[j]-nums[i])+(nums[h]-nums[k]) 的最大值,其中 0<i<j<k<h<nums.size()。

解法:前后缀分解

代码:

int maxExpression(const vector<int> &nums)
{int n = nums.size();// 如果数组长度不足4个元素,返回 -1 表示无解if (n < 4)return -1;// 用来存储从左往右的最大 nums[j] - nums[i]vector<int> left_max(n, 0);int min_i = nums[0];for (int i = 1; i < n; i++){left_max[i] = max(left_max[i - 1], nums[i] - min_i);min_i = min(min_i, nums[i]); // 维护最小的 nums[i]}// 用来存储从右往左的最大 nums[h] - nums[k]vector<int> right_max(n, 0);int max_h = nums[n - 1];for (int i = n - 2; i >= 0; i--){right_max[i] = max(right_max[i + 1], max_h - nums[i]);max_h = max(max_h, nums[i]); // 维护最大的 nums[h]}// 最终结果是 left_max 和 right_max 的最大和int result = INT_MIN;for (int i = 1; i < n - 2; i++){ // i 需要小于 n-2,因为后面还有 k 和 hresult = max(result, left_max[i] + right_max[i + 1]);}return result;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com