LeetCode 236.滑动窗口最大值 题解
题目描述
给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。
玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。
如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。
示例 1:
1 | 输入:nums = [1,5,2] |
示例 2:
1 | 输入:nums = [1,5,233,7] |
算法1
(DP) $O(n^2)$
从题目描述中能够看出来,每个玩家选择的一种解法都是一系列状态的总和
因此,很容易想到使用动态规划来考虑一系列状态的结果
可以使用f[i][j]
来表示区间i~j
内玩家1能够获得的分值
对于区间 i ~ j
来说,如果先手玩家选择了i
,那么后手玩家可以获得的分值就变为f[i + 1][j]
, 反之其分值则变为f[i][j - 1]
那么对于先手玩家来说,其获胜的条件是分值需要大于后手玩家,如果他选择了 位置 i 的分数
,那么他与后手玩家的分差将变为: a[i] - f[i + 1][j]
, 选择了位置 j 的分数,则分差将变更为 a[j] - f[i][j - 1]
两者取最大值,即可得到最终分差
使用这个策略遍历所有的区间之后,f[0][n - 1]就表示第一个先手的玩家其分差最大值,如果大于等于 0,按照规则判胜
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.