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

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

题目描述

给定一个数组 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;
}
相关推荐
前端小巷子1 小时前
JS 打造丝滑手风琴
前端·javascript·面试
程序员清风1 小时前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
AAA修煤气灶刘哥2 小时前
ES 聚合爽到飞起!从分桶到 Java 实操,再也不用翻烂文档
后端·elasticsearch·面试
小高0072 小时前
🚨 2025 最该淘汰的 10 个前端 API!
前端·javascript·面试
大厂码农老A2 小时前
面试官:“聊聊你最复杂的项目?” 为什么90%的候选人第一句就栽了?
java·面试
黑客飓风2 小时前
从基础功能到自主决策, Agent 开发进阶路怎么走?
面试·log4j·bug
在未来等你2 小时前
Kafka面试精讲 Day 7:消息序列化与压缩策略
大数据·分布式·面试·kafka·消息队列
在未来等你2 小时前
Kafka面试精讲 Day 10:事务机制与幂等性保证
大数据·分布式·面试·kafka·消息队列
沐怡旸3 小时前
【算法--链表】109.有序链表转换二叉搜索树--通俗讲解
算法·面试
UrbanJazzerati3 小时前
从零开始前端入门之路 —— VS Code 插件安装 + CSS Reset + Flex 布局
面试