LeetCode题练习与总结:预测赢家--486

一、题目描述

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。

玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。

如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。

示例 1:

输入:nums = [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:

输入:nums = [1,5,233,7]
输出:true
解释:玩家 1 一开始选择 1 。然后玩家 2 必须从 5 和 7 中进行选择。无论玩家 2 选择了哪个,玩家 1 都可以选择 233 。
最终,玩家 1(234 分)比玩家 2(12 分)获得更多的分数,所以返回 true,表示玩家 1 可以成为赢家。

提示:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 10^7

二、解题思路

这个问题可以通过动态规划(DP)来求解。动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

解题思路如下:

  1. 创建一个二维数组 dp,其中 dp[i][j] 表示当数组剩余部分为下标从 i 到 j 时,当前玩家与另一个玩家的分数之差的最大值。

  2. 初始化 dp[i][i] 为 nums[i],因为当数组中只有一个数字时,当前玩家只能选择这个数字,而另一个玩家没有机会选择。

  3. 对于每一个子数组,计算当前玩家可以选择的两个数字(nums[i] 和 nums[j]),并选择能使分数差最大化的数字。具体来说,当前玩家可以选择 nums[i],然后剩余部分为 i+1 到 j,此时对手会从 dp[i+1][j] 中选择最优策略;或者当前玩家可以选择 nums[j],然后剩余部分为 i 到 j-1,此时对手会从 dp[i][j-1] 中选择最优策略。当前玩家的分数差为 nums[i] - dp[i+1][j] 或 nums[j] - dp[i][j-1],取这两种情况的最大值。

  4. 填充 dp 数组,按照子数组长度递增的顺序,计算每个子数组的 dp[i][j]

  5. 最后,检查 dp[0][n-1] 是否大于或等于 0,如果是,则玩家 1 可以成为赢家。

三、具体代码

class Solution {public boolean predictTheWinner(int[] nums) {int n = nums.length;int[][] dp = new int[n][n];// 初始化dp数组,当只有一个数字时,当前玩家只能选择这个数字for (int i = 0; i < n; i++) {dp[i][i] = nums[i];}// 填充dp数组for (int i = n - 2; i >= 0; i--) {for (int j = i + 1; j < n; j++) {dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);}}// 检查玩家1是否能成为赢家return dp[0][n - 1] >= 0;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度

代码中包含两个嵌套循环,这两个循环用于填充 dp 数组:

  • 外层循环控制 dp 数组的行索引 i,从 n - 2 递减到 0,因此外层循环执行了 n - 1 次。

  • 内层循环控制 dp 数组的列索引 j,从 i + 1 增加到 n - 1。对于每个特定的 i,内层循环的执行次数是 n - i - 1

因此,我们可以将总执行次数表示为两个循环执行次数的乘积之和:

(n - 1) + (n - 2) + (n - 3) + ... + 1 + 0

这是一个等差数列求和,其和为 (n - 1) * n / 2。由于我们只关心最高阶项,所以时间复杂度可以简化为 O(n^2)。

2. 空间复杂度

空间复杂度取决于代码中使用的额外空间。在给定的代码中,我们使用了一个二维数组 dp,其大小为 n * n,其中 n 是输入数组 nums 的长度。

因此,空间复杂度是 O(n^2),因为我们需要存储 n^2 个整数值。

五、总结知识点

  • 类定义:定义了一个名为 Solution 的类,这是 Java 中常见的命名方式,用于封装解决问题的方法。

  • 方法定义:在类内部定义了一个名为 predictTheWinner 的公共方法,它接受一个整数数组 nums 作为参数,并返回一个布尔值。

  • 数组长度:使用 int n = nums.length; 获取输入数组的长度。

  • 二维数组:声明并初始化了一个二维数组 dp,用于动态规划计算。

  • 循环结构

    • 初始化循环:使用一个 for 循环来初始化 dp 数组的对角线元素,即当只有一个数字时,当前玩家只能选择这个数字。
    • 嵌套循环:使用两个嵌套的 for 循环来填充 dp 数组的其他元素。
  • 动态规划

    • 状态定义dp[i][j] 表示当数组剩余部分为下标从 i 到 j 时,当前玩家与另一个玩家的分数之差的最大值。
    • 状态转移方程dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);,这表示当前玩家可以选择 nums[i] 或 nums[j],并计算这两种选择下的最大分数差。
  • 数学函数:使用 Math.max 函数来计算两个值中的最大值。

  • 条件判断:使用 return dp[0][n - 1] >= 0; 来判断玩家 1 是否能成为赢家,即如果 dp[0][n - 1] 的值大于或等于 0,则玩家 1 赢。

  • 逻辑推理:代码中包含了逻辑推理,即通过动态规划的方式推断出玩家 1 是否能在游戏中获胜。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493860.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 启动类 SpringApplication 二 run方法

配置 在Program arguments配置2个参数&#xff1a;--server.port8081 --spring.profiles.activedev。 run方法 run方法执行结束代表SpringBoot启动完成&#xff0c;即完成加载bean。 // ConfigurableApplicationContext 是IOC容器 public ConfigurableApplicationContext ru…

如何调大unity软件的字体

一、解决的问题&#xff1a; unity软件的字体太小&#xff0c;怎么调大点&#xff1f;二、解决方法&#xff1a; 1.操作步骤&#xff1a; 打开Unity编辑器> Edit>preferences> UI Scaling>Use custom scaling value&#xff08;取消勾选“使用默认桌面设置”&…

SYD881X RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟

RTC定时器事件在调用timeAppClockSet后会出现比较大的延迟 这里RTC做了两个定时器一个是12秒,一个是185秒: #define RTCEVT_NUM ((uint8_t) 0x02)//当前定时器事件数#define RTCEVT_12S ((uint32_t) 0x0000002)//定时器1s事件 /*整分钟定时器事件&#xff0c;因为其余的…

内置函数.

日期函数 current_date/time() 日期/时间 获得年月日&#xff1a; 获得时分秒&#xff1a; 获得时间戳&#xff1a;日期时间 now()函数 体会date(datetime)的用法&#xff1a;只显示日期 在日期的基础上加日期&#xff1a;按照日历自动计算 关键字为 intervalinterval 后的数值…

PHP 微信棋牌开发全解析:高级教程

PHP - 多维数组详解 多维数组是 PHP 中一种强大的数据结构&#xff0c;指的是一个数组的元素中可以包含一个或多个数组。它常用于存储复杂的嵌套数据&#xff0c;如表格数据或多层次关系的数据结构。 注释&#xff1a; 数组的维度表示您需要指定索引的层级数&#xff0c;以访问…

【Java】递归算法

递归的本质&#xff1a; 方法调用自身。 案例1. 斐波那契数列 1 1 2 3 5 8 13 21 .. f(n)f(n-1)f(n-2) 方法的返回值&#xff1a; 只要涉及到加减乘除&#xff0c;就是int,其他的就是void。 案例2. 青蛙跳台 青蛙一次可以跳一级台阶&#xff0c;也可以跳两级台阶&#xff…

JVM简介—1.Java内存区域

大纲 1.运行时数据区的介绍 2.运行时数据区各区域的作用 3.各个版本内存区域的变化 4.直接内存的使用和作用 5.站在线程的角度看Java内存区域 6.深入分析堆和栈的区别 7.方法的出入栈和栈上分配、逃逸分析及TLAB 8.虚拟机中的对象创建步骤 9.对象的内存布局 10.对象的…

大腾智能CAD:国产云原生三维设计新选择

在快速发展的工业设计领域&#xff0c;CAD软件已成为不可或缺的核心工具。它通过强大的建模、分析、优化等功能&#xff0c;不仅显著提升了设计效率与精度&#xff0c;还促进了设计思维的创新与拓展&#xff0c;为产品从概念构想到实体制造的全过程提供了强有力的技术支持。然而…

设计模式の享元模板代理模式

文章目录 前言一、享元模式二、模板方法模式三、代理模式3.1、静态代理3.2、JDK动态代理3.3、Cglib动态代理3.4、小结 前言 本篇是关于设计模式中享元模式、模板模式、以及代理模式的学习笔记。 一、享元模式 享元模式是一种结构型设计模式&#xff0c;目的是为了相似对象的复用…

Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…

用人话讲计算机:Python篇!(十五)迭代器、生成器、装饰器

一、迭代器 &#xff08;1&#xff09;定义 标准解释&#xff1a;迭代器是 Python 中实现了迭代协议的对象&#xff0c;即提供__iter__()和 __next__()方法&#xff0c;任何实现了这两个方法的对象都可以被称为迭代器。 所谓__iter__()&#xff0c;即返回迭代器自身 所谓__…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

【Android】unzip aar删除冲突classes再zip

# 解压JAR文件 jar xf your-library.jar # 解压AAR文件&#xff08;AAR实际上是ZIP格式&#xff09; unzip your-library.aar # 删除不需要的类 rm -rf path/to/com/example/unwanted/ # 对于JAR打包 jar cf your-library-modified.jar -C path/to/unzipped/ . # 对于AAR打包…

使用C语言编写UDP循环接收并打印消息的程序

使用C语言编写UDP循环接收并打印消息的程序 前提条件程序概述伪代码C语言实现编译和运行C改进之自由设定端口注意事项在本文中,我们将展示如何使用C语言编写一个简单的UDP服务器程序,该程序将循环接收来自指定端口的UDP消息,并将接收到的消息打印到控制台。我们将使用POSIX套…

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架&#xff0c;适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统&#xff0c;支持用户注册、登录、发布文章等功能。 步骤&#xff1a; 安装 Flask 和其他必要库&#xff1a; 在开发博客之前&#xff0c;首…

Vue(二)

1.Vue生命周期 Vue生命周期就是一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a; 创建阶段&#xff1a;创建响应式数据。 挂载阶段&#xff1a;渲染模板。 更新阶段&#xff1a;修改数据&#xff0c;更新视图。 销毁阶段&#xff1a;销毁Vue实例。 …

macOS 配置 vscode 命令行启动

打开 vscode 使用 cmd shift p 组合快捷键&#xff0c;输入 install 点击 Install ‘code’ command in PATH Ref https://code.visualstudio.com/docs/setup/mac

python coding(二) Pandas 、PIL、cv2

Pandas 一个分析结构化数据的工具集。Pandas 以 NumPy 为基础&#xff08;实现数据存储和运算&#xff09;&#xff0c;提供了专门用于数据分析的类型、方法和函数&#xff0c;对数据分析和数据挖掘提供了很好的支持&#xff1b;同时 pandas 还可以跟数据可视化工具 matplotli…

期权VIX指数构建与择时应用

芝加哥期权交易 所CBOE的波动率指数VIX 是反映 S&P 500 指数未来 30 天预测期波动率的指标&#xff0c;由于预期波动率多用于表征市场情绪&#xff0c;因此 VIX 也被称为“ 恐慌指数”。 VIX指数计算 VIX 反映了市场情绪和投资者的风险偏好&#xff0c; 对于欧美市场而言…

一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测

一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习&#xff01;VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…