预测赢家
题目¶
[486] 预测赢家
给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。
给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化
递归¶
/**
* @param {number[]} nums
* @return {boolean}
*/
var PredictTheWinner = function(nums) {
const total = nums.reduce((acc, x) => acc += x, 0);
return maxScore(nums, 0, nums.length -1) >= total / 2;
};
function maxScore(nums, l, r) {
if (l === r) {
return nums[l];
}
if (l === r - 1) {
return nums[l] > nums[r] ? nums[l] : nums[r];
}
// 玩家2,取过数最大数之后的几种情况。
const scoreLeft = nums[l] + Math.min(maxScore(nums, l + 2, r), maxScore(nums, l + 1, r - 1));
const scoreRight = nums[r] + Math.min(maxScore(nums, l + 1, r - 1), maxScore(nums, l, r - 2));
return scoreLeft > scoreRight ? scoreLeft : scoreRight;
}
动态规划¶