【问题描述】[中等]

【解答思路】

1.递归


复杂度

class Solution {public boolean PredictTheWinner(int[] nums) {return total(nums,0,nums.length-1,1) >=0;}//turn 标记轮到谁了 正数表示先手 负数表示后手  public  int total( int[]nums ,int start,int end,int turn){if(start == end){return   nums[start]*turn;}int scoreStart = nums[start]*turn +total(nums,start+1,end,-turn);int scoreEnd = nums[end] *turn +total(nums,start ,end-1,-turn);//先选绝对值最大的那个分数,再把它转换成先后手选手对应的正分或负分// return Math.max(scoreStart * turn, scoreEnd * turn) * turn;if(turn == 1){return Math.max(scoreStart,scoreEnd);}else{return Math.min(scoreStart,scoreEnd);}}
}
2. 动态规划

方法一使用递归,存在大量重复计算,因此时间复杂度很高。由于存在重复子问题,因此可以使用动态规划降低时间复杂度。
第 1 步:设计状态
定义二维数组dp,其行数和列数都等于数组的长度,dp[i][j] 表示当数组剩下的部分为下标 i 到下标 j 时,当前玩家与另一个玩家的分数之差的最大值,注意当前玩家不一定是先手。

第 2 步:状态转移方程

第 3 步:考虑初始化

第 4 步:考虑输出
dp[0][length]
第 5 步:考虑是否可以状态压缩

时间复杂度:O(N2) 空间复杂度:O(N2)

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

时间复杂度:O(N2) 空间复杂度:O(N)

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

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2.递归 自上而下 动态规划 自底向上
3.算法思想

【数据结构与算法】【算法思想】动态规划

转载链接:https://leetcode-cn.com/problems/predict-the-winner/solution/yu-ce-ying-jia-by-leetcode-solution/

[Leetcode][第486题][JAVA][预测赢家][动态规划][递归]相关推荐

  1. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

    [问题描述][简单] [解答思路] 1. 递归 终止条件/基本情况 root ==null 递推关系 max(l,r)+1 时间复杂度:O(N) 空间复杂度:O(height) class Solut ...

  2. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

    [问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...

  3. [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]

    [问题描述][简单] [解答思路] 1. 双指针 时间复杂度:O(N+M) 空间复杂度:O(1) class Solution {public:bool isSubsequence(string s, ...

  4. [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]

    [问题描述][困难] [解答思路] 1. 记忆化搜索 时间复杂度:O(n^3) 空间复杂度:O(n^2) class Solution {public int[][] rec;public int[] ...

  5. [剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]

    [问题描述][中等] [解答思路] 1. 动态规划 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public int nthUglyNumber(int n) {int ...

  6. [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

    [问题描述][简单] [解答思路] 1. 递归 自下而上 基本情况/结束条件 : 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 roo ...

  7. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  8. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  9. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

最新文章

  1. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)
  2. OpenAI雄心勃勃的机器人计划失败了:强化学习没法用?
  3. 从docker 中抓取jvm heap 信息, 并且分析
  4. VTK:环境球AmbientSpheres用法实战
  5. java复合赋值运算符_Java 之复合赋值运算符
  6. mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中
  7. 动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法
  8. 德不配位,势必遭殃!人事斗争,劝你不要参与!
  9. java迭代器输入的结果_Java学习之Iterator(迭代器)的一般用法 (转)
  10. 微软3月补丁星期二修复71个漏洞,其中3个是0day
  11. 栈与队列篇:347. 前 K 个高频元素(难度 中等)
  12. SUN SPARC T4-4电源故障引起的宕机
  13. python中del的用法
  14. [全新大碟]周杰倫 - 魔杰座
  15. 时下流行的css3页面纵向滑动效果
  16. 在线直播: 在 gTech 工作是一番怎样的体验?
  17. oppop+r1c怎么设置语言中文,OPPO R1C怎么样 OPPO R1C手机评测 (全文)
  18. 003Visual Basic装饰模式
  19. Linux安装GIT最新版
  20. 我是如何准备秋招互联网大厂后端学习的?

热门文章

  1. 2.3线性表的链式存储和运算—单链表应用举例
  2. ASP.NET学习笔记之操作过滤器
  3. 在Matlab2006a中如何创建.net组件
  4. erp系统服务器都是维护些什么意思,erp系统维护服务器维护管理文档.doc
  5. php array第一张图片_PHP array_udiff() 函数
  6. Android 自定义带图标Toast,工具方法,Toast自定义显示时间
  7. 小程序 mpvue 使用canvas绘制环形图表
  8. 4 微信公众号开发 被动回复消息 回复没有反应怎么办
  9. TFS2010映射工作区问题 路径 XXX 已在工作区 XXX;XXX 中映射
  10. spring security 认证与权限控制