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

news2024/12/23 7:00:22

一、题目描述

给你一个整数数组 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.coloradmin.cn/o/2264113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

Spring Boot 教程之三十六:实现身份验证

如何在 Spring Boot 中实现简单的身份验证&#xff1f; 在本文中&#xff0c;我们将学习如何使用 Spring设置和配置基本身份验证。身份验证是任何类型的安全性中的主要步骤之一。Spring 提供依赖项&#xff0c;即Spring Security&#xff0c;可帮助在 API 上建立身份验证。有很…

什么样的LabVIEW控制算自动控制?

自动控制是指系统通过预先设计的算法和逻辑&#xff0c;在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整&#xff0c;达到预期目标的过程。LabVIEW作为一种图形化编程工具&#xff0c;非常适合开发自动控制系统。那么&#xff0c;什么样的LabVIEW控制算作“自动…

GFPS扩展技术原理(七)-音频切换消息流

音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力&#xff0c;触发连接做切换&#xff0c;获取或设置音频切换偏好&#xff0c;通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07&#xff0c;Message codes如下&#xff1a; MAC of Audio s…

视频直播点播平台EasyDSS与无人机技术的森林防火融合应用

随着科技的飞速发展&#xff0c;无人机技术以其独特的优势在各个领域得到了广泛应用&#xff0c;特别是在森林防火这一关键领域&#xff0c;EasyDSS视频平台与无人机技术的融合应用更是为传统森林防火手段带来很大的变化。 一、无人机技术在森林防火中的优势 ‌1、快速响应与高…

机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及RRT四种算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1贪婪搜索算法原理 4.2最安全距离算法原理 4.3RPM 算法原理 4.4 RRT 算法原理 5.完整程序 1.程序功能描述 机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及R…

【论文笔记】Visual Alignment Pre-training for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功&#xff0c;接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

C++-----函数与库

数学中的函数与编程中的函数对比 数学中的函数 - 数学函数是一种映射关系&#xff0c;例如&#xff0c;函数\(y f(x)x^{2}\)&#xff0c;对于每一个输入值\(x\)&#xff0c;都有唯一确定的输出值\(y\)。它侧重于描述变量之间的数量关系&#xff0c;通常通过公式来表示这种关系…

带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式适配器模式&#xff08;Adapter Pattern&#xff09;概述talk is cheap&#xff0c; show you my code总结 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是面向对象软件设计中的一种结构型设计…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

初等函数整理

1.幂函数 2.指数函数 3.对数函数

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将写到一些手搓常用工具&#xff0c;方便在项目中的使用&#xff0c;并且在手搓的过程中一些函数如&#xff1a;日志 宏中的__VA_ARGS__接收可变参…

路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)

狼群算法(Wolf Pack Algorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为方式来实…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】

继上一篇的hello world&#xff1a; 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门hello world输出【入门一】-CSDN博客】 这一篇我们开始任务的创建。 工程还是用上一篇的hello world作为模板&#xff0c;hello world就不再app_main函数中输出&#xff0c;改成在任务…

用音乐与自我对话 ——澄迈漓岛音乐节x草台回声

四季循环&#xff0c;昼夜往复&#xff0c;在相对恒定的日常中&#xff0c;音乐是扇打量世界又内观本心的双向窗户。难以描述的触动&#xff0c;透过音乐语言转换为温热且真实的吟唱&#xff0c;一次又一次记录与释放。 除却生浪主舞台中的声音玩具乐队以及STOLEN秘密行动&…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负&#xff0c;然后下正上负。当二极管接到反向电压&#xff0c;二极管存在寄生电容&#xff0c;电压不能立刻突变&#xff0c;当输入频率变高时&#…

HTTP协议及安全防范

由于图片解析问题&#xff0c;可以点击查看 &#x1f449;&#x1f3fb; 博客原文 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议&#xff0c;客户端通过发送请求到服务器来获取…

LabVIEW深海气密采水器测控系统

LabVIEW的深海气密采水器测控系统通过高性价比的硬件选择与自主开发的软件&#xff0c;实现了高精度的温度、盐度和深度测量&#xff0c;并在实际海上试验中得到了有效验证。 项目背景 深海气密采水器是进行海底科学研究的关键工具&#xff0c;用LabVIEW开发了一套测控系统&am…