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

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

题目描述

给定一个数组 nums,求 (numsj-numsi)+(numsh-numsk) 的最大值,其中 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;
}
相关推荐
沉默王二20 分钟前
腾讯一面,我霸气反问:“你说你们在做Agent项目,说说 SubAgent、Plan 模式、Skill 调用这些你们都是怎么做的?”面试官一直在擦汗。。
面试·agent·ai编程
程序员Rock4 小时前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
PBitW8 小时前
git 中容易遗忘的点 (二) ⚡⚡⚡
前端·git·面试
浩哥学JavaAI8 小时前
2026年最新AI agent面试(07)_大模型架构基础
人工智能·面试·架构
PBitW8 小时前
git 中容易遗忘的点 (三) 🚀🚀🚀
前端·git·面试
十八岁牛爷爷10 小时前
C/C++ 六大关键字(static、const、volatile、extern、register、inline)面试三层级详解
开发语言·c++·面试
胡萝卜术10 小时前
抽象的三级跳:从原生 DOM 到 React 组件树,我们到底在解决什么问题?
前端·javascript·面试
黄敬峰11 小时前
从零理解React:事件、组件与响应式——一个WebGPU Demo的前端笔记
前端·面试
weedsfly11 小时前
从类继承到自定义 Hook:模板方法模式的前端演进
前端·javascript·面试
小陈工11 小时前
第8篇:Flask轻量级框架与扩展生态深度解析(下)
后端·python·面试