[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 }
相關文章
相關標籤/搜索