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

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

题目描述

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

解法:前后缀分解

代码:

cpp 复制代码
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 和 h
		result = max(result, left_max[i] + right_max[i + 1]);
	}

	return result;
}
相关推荐
Dream it possible!几秒前
LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)(栈+哈希表)
c++·leetcode·面试··哈希表
怪兽201442 分钟前
IntentService 的应用场景和使用方式?
android·面试
编程岁月2 小时前
java面试-0141-java反射?优缺点?场景?原理?Class.forName和ClassLoader区别?
java·开发语言·面试
沐怡旸5 小时前
【底层机制】【Android】Binder架构与原理
android·面试
crystal_pin5 小时前
wangEditor与kityFormula集成解决思路
面试
007php0075 小时前
Docker 实战经验之关键文件误删恢复指南(一)
jvm·docker·云原生·容器·面试·职场和发展·eureka
渣哥5 小时前
别再乱用了!Spring AOP 与 AspectJ 的区别比你想的复杂
javascript·后端·面试
xxxxxxllllllshi6 小时前
Cookie、Session、JWT、SSO,网站与 APP 登录持久化与缓存
java·开发语言·jvm·数据结构·缓存·面试
拉不动的猪6 小时前
回顾前端项目打包时--脚本引入时机与环境类型的判断问题
前端·vue.js·面试
渣哥6 小时前
还在写繁琐监听器?Spring @EventListener 注解让你代码瞬间简化
javascript·后端·面试