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

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

题目描述

给定一个数组 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 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
倍利福猎头公司官方账号11 小时前
2026具身智能赛道还火热吗?机器人人选该如何思考下半年的工作机会?
人工智能·面试·职场和发展·机器人·求职招聘
SamDeepThinking13 小时前
关于java final关键字的可见性
java·后端·面试
此时不提桶,更待何时14 小时前
02-05-B-虚拟线程面试与生产事故实战
java·面试
一条溺水的鱼16 小时前
一次讲透 JS 闭包 —— 概念、原理、应用和内存泄漏
javascript·面试
程序员清风16 小时前
聊聊我的AI学习方法与思考!
java·后端·面试
流浪00117 小时前
Linux系统篇36——线程(一) 线程的概念、本质和Linux的实现方式
linux·面试·操作系统·线程
狂师18 小时前
2026互联网大厂秋招AI Coding笔试全攻略!
人工智能·面试·求职
彧azz1 天前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
默_笙1 天前
💫 闭包是个背包:拆解小米前端面试题里的三道"闭包陷阱"
前端·javascript·面试