🔗 题目链接:3745. 三元素表达式的最大值
📚 所属题单:灵茶山艾府 · 贪心算法题单 --- §1.1 从最小/最大开始贪心
🏷️ 难度:Easy | 难度分:1218
🔖 标签:贪心、数组、排序
📖 题目描述
给你一个整数数组 nums。
从 nums 中选择三个元素 a、b 和 c,它们的下标需互不相同 ,使表达式 a + b - c 的值最大化。
返回该表达式可能的 最大值。
示例 1
输入:nums = [1,4,2,5]
输出:8
解释:选择 a = 4,b = 5,c = 1。表达式的值为 4 + 5 - 1 = 8,这是可能的最大值。
示例 2
输入:nums = [-2,0,5,-2,4]
输出:11
解释:选择 a = 5,b = 4,c = -2。表达式的值为 5 + 4 - (-2) = 11,这是可能的最大值。
提示
3 <= nums.length <= 100-100 <= nums[i] <= 100
💡 思路分析
a + b - c 要最大化,拆开来看:
a + b要尽量大 → 选最大的两个数c要尽量小 → 选最小的那个数
由于 a、b、c 下标互不相同(但数组至少 3 个元素),排序后最大的两个和最小的那个肯定不会重叠(除非数组恰好 3 个元素,那也没问题)。
这就像买菜------你手里拿着两个最贵的菜,然后找到商场里最便宜的一个打折扣。总价减去折扣,收益最大 💰
算法步骤
- 排序:把数组从小到大排
- 返回结果 :
nums[n-1] + nums[n-2] - nums[0](最大的两个减最小的)
就这么简单,一行搞定。
✅ 代码实现(Java)
java
class Solution {
public int maximizeExpressionOfThree(int[] nums) {
// 排序:最小的在前,最大的在后
Arrays.sort(nums);
int n = nums.length;
// a + b 取最大的两个,c 取最小的那个
return nums[n - 1] + nums[n - 2] - nums[0];
}
}
📊 复杂度分析
| 复杂度 | 说明 | |
|---|---|---|
| ⏱️ 时间 | O(n log n) | 排序 |
| 💾 空间 | O(log n) | 排序的栈空间 |
🔗 参考
🎯 这题简单到有点不好意思说它是贪心------排序后首尾各取一下就完了。但它完美诠释了 §1.1 的核心思想:从最大/最小开始贪心。