难度:中等
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子
piles[i]。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。
亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。
假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回
true,当李赢得比赛时返回false。示例:
输入:[5,3,4,5] 输出:true 解释: 亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。 假设他取了前 5 颗,这一行就变成了 [3,4,5] 。 如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。 如果李拿走后 5 颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。 这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回 true 。提示:
2 <= piles.length <= 500piles.length是偶数。1 <= piles[i] <= 500sum(piles)是奇数。
分析:
这篇是预测赢家的特例,多了两个限制,可以用预测赢家的代码
https://blog.youkuaiyun.com/Duck_Duck_/article/details/108335905
但由于限制条件的存在(piles.length是偶数),可以将石子分作奇数堆和偶数堆;
例如:下标 0 1 2 3 4 5 6 7
数字 3 6 8 3 5 9 2 4
粗体为下标偶数堆,显然例子中奇数堆的总数大一些,那只要先手拿奇数堆的数字4,必赢,因为留给后手拿的数字(3和2)都是属于偶数堆的,后续也是一样;那可以推论出,piles.length为偶数时,先手必赢,所以直接return true就可以了。
代码:
class Solution {
public boolean stoneGame(int[] piles) {
return true;
}
}
结果:


本文探讨了一个特殊的游戏策略问题,即在特定条件下(石子堆数量为偶数且总数为奇数),先手玩家如何确保在游戏中获胜。通过分析石子堆的排列规律,我们发现先手玩家可以通过选择特定的石子堆,使得对手始终处于劣势,从而确保自己最终获胜。文章提供了详细的策略解析和代码实现。
303

被折叠的 条评论
为什么被折叠?



