[Swift]LeetCode486. 预测赢家 | Predict the Winner

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-tjolcfxk-me.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from either end of the array followed by the player 2 and then player 1 and so on. Each time a player picks a number, that number will not be available for the next player. This continues until all the scores have been chosen. The player with the maximum score wins.git

Given an array of scores, predict whether player 1 is the winner. You can assume each player plays to maximize his score.github

Example 1:数组

Input: [1, 5, 2]
Output: False
Explanation: Initially, player 1 can choose between 1 and 2. 
If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2).
So, final score of player 1 is 1 + 2 = 3, and player 2 is 5.
Hence, player 1 will never be the winner and you need to return False. 

Example 2:微信

Input: [1, 5, 233, 7]
Output: True
Explanation: Player 1 first chooses 1. Then player 2 have to choose between 5 and 7. No matter which number player 2 choose, player 1 can choose 233.
Finally, player 1 has more score (234) than player 2 (12), so you need to return True representing player1 can win. 

Note:spa

  1. 1 <= length of the array <= 20.
  2. Any scores in the given array are non-negative integers and will not exceed 10,000,000.
  3. If the scores of both players are equal, then player 1 is still the winner.

给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,而后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取以后再也不可取。直到没有剩余分数可取时游戏结束。最终得到分数总和最多的玩家获胜。code

给定一个表示分数的数组,预测玩家1是否会成为赢家。你能够假设每一个玩家的玩法都会使他的分数最大化。htm

示例 1:blog

输入: [1, 5, 2]
输出: False
解释: 一开始,玩家1能够从1和2中进行选择。
若是他选择2(或者1),那么玩家2能够从1(或者2)和5中进行选择。若是玩家2选择了5,那么玩家1则只剩下1(或者2)可选。
因此,玩家1的最终分数为 1 + 2 = 3,而玩家2为 5。
所以,玩家1永远不会成为赢家,返回 False。

示例 2:游戏

输入: [1, 5, 233, 7]
输出: True
解释: 玩家1一开始选择1。而后玩家2必须从5和7中进行选择。不管玩家2选择了哪一个,玩家1均可以选择233。
最终,玩家1(234分)比玩家2(12分)得到更多的分数,因此返回 True,表示玩家1能够成为赢家。

注意:

  1. 1 <= 给定的数组长度 <= 20.
  2. 数组里全部分数都为非负数且不会大于10000000。
  3. 若是最终两个玩家的分数相等,那么玩家1仍为赢家。

Runtime: 12 ms
Memory Usage: 3.9 MB
 1 class Solution {
 2     func PredictTheWinner(_ nums: [Int]) -> Bool {
 3         var nums = nums
 4         var n:Int = nums.count
 5         var dp:[[Int]] = [[Int]](repeating:[Int](repeating:-1,count:n),count:n)
 6         return canWin(&nums, 0, n - 1, &dp) >= 0
 7     }
 8     
 9     func canWin(_ nums:inout [Int],_ s:Int,_ e:Int,_ dp:inout [[Int]]) -> Int
10     {
11         if dp[s][e] == -1
12         {
13             dp[s][e] = (s == e) ? nums[s] : max(nums[s] - canWin(&nums, s + 1, e, &dp), nums[e] - canWin(&nums, s, e - 1, &dp))
14         }
15         return dp[s][e]
16     }
17 }
相关文章
相关标签/搜索