原题链接在这里:https://leetcode.com/problems/predict-the-winner/description/

题目:

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.

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

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:

  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.

题解:

dp[i][j]是nums 从i到j这一段[i, j] 先手的player 比 后手多得到多少分.

先手 pick first. 递推时 dp[i][j] = Math.max(nums[i]-dp[i+1][j], nums[j]-dp[i][j-1]). 如果A选了index i的score, B只能选择[i+1, j]区间内的score. 如果A选了index j的score, B只能选择[i, j-1]区间内的score.

看到计算dp[i][j]时, i 需要 i+1, j 需要 j-1. 所以循环时 i从大到小, j 从小到大.

初始化区间内只有一个数字时就是能得到的最大分数.

答案看[0, nums.length-1]区间内 A得到的score是否大于等于0.

Time Complexity: O(len^2). len = nums.length.

Space: O(len^2).

AC Java:

 class Solution {
public boolean PredictTheWinner(int[] nums) {
if(nums == null || nums.length == 0){
return true;
} int len = nums.length;
int [][] dp = new int[len][len];
for(int i = len-1; i>=0; i--){
for(int j = i+1; j<len; j++){
int head = nums[i]-dp[i+1][j];
int tail = nums[j]-dp[i][j-1];
dp[i][j] = Math.max(head, tail);
}
}
return dp[0][len-1] >= 0;
}
}

空间优化.

Time Complexity: O(len^2). len = nums.length.

Space: O(len).

AC Java:

 class Solution {
public boolean PredictTheWinner(int[] nums) {
if(nums == null || nums.length == 0){
return true;
} int len = nums.length;
int [] dp = new int[len];
for(int i = len-1; i>=0; i--){
for(int j = i+1; j<len; j++){
int head = nums[i]-dp[j];
int tail = nums[j]-dp[j-1];
dp[j] = Math.max(head, tail);
}
}
return dp[len-1] >= 0;
}
}

另一种implementation.

Time Complexity: O(len^2). len = nums.length.

Space: O(len^2).

 class Solution {
public boolean PredictTheWinner(int[] nums) {
if(nums == null || nums.length == 0){
return true;
} int n = nums.length;
int [][] dp = new int[n][n];
for(int i = 0; i<n; i++){
dp[i][i] = nums[i];
} for(int size = 1; size<n; size++){
for(int i = 0; i+size<n; i++){
dp[i][i+size] = Math.max(nums[i]-dp[i+1][i+size], nums[i+size]-dp[i][i+size-1]);
}
} return dp[0][n-1] >= 0;
}
}

Exact the same as Stone Game.

Reference: https://discuss.leetcode.com/topic/76830/java-9-lines-dp-solution-easy-to-understand-with-improvement-to-o-n-space-complexity

最新文章

  1. Http状态码笔记
  2. H5瀑布流如何实现
  3. 定时器的应用---查询方式---让8个LED灯,左右各4个来回亮
  4. django book
  5. 无缝漫游 Seamless Roaming
  6. Android控件之Button(按钮控件)和ImageButton(图片按钮控件)
  7. 创建immutable类
  8. 从零开始学android开发-项目debug
  9. PageMapAdapter MapAdapter (续webServices)
  10. Adobe Photoshop CC 2015安装激活
  11. JavaSE思维导图(六)
  12. SDL 简介
  13. linux git升级到1.8.3
  14. LSTM主要思想和网络结构
  15. js可拖拽的div
  16. vim 常用 NERDTree 快捷键
  17. pickle模块及其API
  18. 10.vue框架
  19. 论文笔记:Diffusion-Convolutional Neural Networks (传播-卷积神经网络)
  20. Android进阶AIDL - 2018年4月14日

热门文章

  1. 如何安装/更新ruby,安装cocoapods,为开发做好准备!(2016年12月07日更新内容)
  2. $git学习总结系列(2)——远程仓库
  3. Linux脚本程序包及安装
  4. 【HackerRank】Sherlock and Array
  5. 【HackerRank】The Love-Letter Mystery
  6. 编写自已的第一个MapReduce程序
  7. Linux下解压分包文件zip(zip/z01/z02)
  8. .NET 中如何判断文件与目录
  9. sqlserver的疑难杂症解析
  10. Avoid RegionServer Hotspotting Despite Sequential Keys