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

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

题目描述

给定一个数组 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;
}
相关推荐
我叫黑大帅10 小时前
Go日志库工程选型与逃逸分析评测报告
后端·面试·go
此时不提桶,更待何时12 小时前
05-05-B-对象存储与文件服务面试与生产事故实战
面试·nosql
晚安日记wanna13 小时前
大厂禁 JOIN 的真正原因,拆到第四层才清楚
数据库·后端·面试
多喝水身体棒14 小时前
Spring Boot 自动配置原理,看完终于不慌了
面试·程序员
丑陋小蚊子15 小时前
有作品集的岗位,简历和作品各写什么?
面试·求职招聘·大学生·简历·简历下载
多多爱学习16 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
丑陋小蚊子16 小时前
同一家公司升过岗,简历别合成一段
面试·求职招聘·大学生·简历·简历下载
此时不提桶,更待何时16 小时前
05-04-B-HBase与时序库面试与生产事故实战
数据库·面试·hbase
怕浪猫18 小时前
分享一个做视频的skill,这条白板视频,每一笔都是代码画的
前端·javascript·面试
弈栈录20 小时前
基于 Spring Boot 构建生产级 AI 应用平台
后端·面试·架构