3828. 删除子数组后的最终元素
February 6, 2026 · View on GitHub
题目描述
给你一个整数数组 nums。
有两名玩家,Alice 和 Bob,轮流进行游戏,Alice 先手。
- 在每一轮中,当前玩家可以选择任意一个子数组
nums[l..r],满足r - l + 1 < m,其中m是 当前数组的长度。 - 被选中的 子数组将被移除,剩余的元素将连接 起来形成新的数组。
- 游戏持续进行,直到 仅剩一个 元素为止。
Alice 的目标是 最大化 最终剩下的元素,而 Bob 的目标则是 最小化 它。假设双方都采取最优策略,返回最终剩下的元素的值。
子数组 是数组中连续的且 非空 的一段元素。
示例 1:
输入: nums = [1,5,2]
输出: 2
解释:
一种有效的最优策略:
- Alice 移除
[1],数组变为[5, 2]。 - Bob 移除
[5],数组变为[2]。因此,答案是 2。
示例 2:
输入: nums = [3,7]
输出: 7
解释:
Alice 移除[3],数组变为[7]。由于 Bob 无法再进行回合,答案是 7。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 105
解法
方法一:脑筋急转弯
由于 Alice 先手,Alice 可以选择移除除第一个元素和最后一个元素之外的所有元素,那么答案至少为 。
而对于 的情况,即便 Alice 想要保留这中间的某个元素,Bob 也可以选择移除它,因此答案至多为 。
时间复杂度 ,空间复杂度 。
Python3
class Solution:
def finalElement(self, nums: List[int]) -> int:
return max(nums[0], nums[-1])
Java
class Solution {
public int finalElement(int[] nums) {
return Math.max(nums[0], nums[nums.length - 1]);
}
}
C++
class Solution {
public:
int finalElement(vector<int>& nums) {
return max(nums[0], nums.back());
}
};
Go
func finalElement(nums []int) int {
return max(nums[0], nums[len(nums)-1])
}
TypeScript
function finalElement(nums: number[]): number {
return Math.max(nums.at(0)!, nums.at(-1)!);
}