前言
又是好久没有更新了
正文
问题来源
本问题来自leetcode上的877题。
问题描述
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 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 。
分析:
我的第一想法就是用递归暴力来做这道题:
将递归的上一层和下一层分别看成两个选手,递归的上一层若是能将下一层逼到输的境地,则返回true,如果不能则返回false。
然而这个算法没有在规定时间内跑完所有用例
func stoneGame(piles []int) bool {
return dfs(piles, 0, len(piles)-1, 0, 0)
}
// l和r代表左右指针 at和bt分别代表当前选手和对手获取的石子数
func dfs(piles []int, l, r, at, bt int) bool {
if l == r {
if piles[l] + at > bt {
return true
} else if piles[l] + at < bt {
return false
} else {
fmt.Println("is not existed")
}
}
if !dfs(piles, l+1, r, bt, at+piles[l]) {
return true
}
if !dfs(piles, l, r-1, bt, at+piles[r]) {
return true
}
return false
}
总结:
勤思考。
结语
不管怎么样好好加油。