package LeetCode_486
/**
* 486. Predict the Winner
* https://leetcode.com/problems/predict-the-winner/description/
* https://www.youtube.com/watch?v=g5wLHFTodm0
*
* Min-Max策略:大家都是拿最大的分数,直到拿完;
* 1.先把递归树画出来,到游戏结束时,我们有最终分数,然后backtracking to parent;
* 2.parent会在所有的children选择最有利的;
* */
class Solution {
private var array: Array<IntArray>? = null
fun PredictTheWinner(nums: IntArray): Boolean {
/*
method 1: Min-Max
* Time complexity: O(2^n)
* Space complexity: O(n), recursion stack
* */
//return getScore(nums, 0, nums.size - 1) >= 0
/*
* method 2: recursion + memorization
* Time complexity: O(n*n)
* Space complexity: O(n*n)
* */
array = Array(nums.size) { IntArray(nums.size) }
return getScore(nums, 0, nums.size - 1) >= 0
}
private fun getScore(nums: IntArray, left: Int, right: Int): Int {
if (left == right) {
return nums[left]
}
if (array!![left][right] > 0) {
return array!![left][right]
}
//compare each player can get
array!![left][right] = Math.max(
nums[left] - getScore(nums, left + 1, right),
nums[right] - getScore(nums, left, right - 1)
)
return array!![left][right]
}
}