【LeetCode每日一题: 375. 猜数字大小 II | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

news2024/10/7 14:27:04

在这里插入图片描述

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🍎座右铭:人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯🎯

在这里插入图片描述

目录

    • 题目链接
    • 题目描述
    • 求解思路&实现代码&运行结果
      • 暴力递归
        • 求解思路
        • 实现代码
        • 运行结果
      • 记忆化搜索
        • 求解思路
        • 实现代码
        • 运行结果
      • 动态规划
        • 求解思路
        • 实现代码
        • 运行结果
    • 共勉

题目链接

375. 猜数字大小 II

题目描述

我们正在玩一个猜数游戏,游戏规则如下:

我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会输掉游戏 。
给你一个特定的数字 n ,返回能够确保你获胜的最小现金数,不管我选择那个数字 。

示例 1:
在这里插入图片描述

输入:n = 10
输出:16
解释:制胜策略如下:

  • 数字范围是 [1,10] 。你先猜测数字为 7 。
    • 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $7 。
    • 如果我的数字更大,则下一步需要猜测的数字范围是 [8,10] 。你可以猜测数字为 9 。
      • 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $9 。
      • 如果我的数字更大,那么这个数字一定是 10 。你猜测数字为 10 并赢得游戏,总费用为 $7 + $9 = $16 。
      • 如果我的数字更小,那么这个数字一定是 8 。你猜测数字为 8 并赢得游戏,总费用为 $7 + $9 = $16 。
    • 如果我的数字更小,则下一步需要猜测的数字范围是 [1,6] 。你可以猜测数字为 3 。
      • 如果这是我选中的数字,你的总费用为 $7 。否则,你需要支付 $3 。
      • 如果我的数字更大,则下一步需要猜测的数字范围是 [4,6] 。你可以猜测数字为 5 。
        • 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $5 。
        • 如果我的数字更大,那么这个数字一定是 6 。你猜测数字为 6 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
        • 如果我的数字更小,那么这个数字一定是 4 。你猜测数字为 4 并赢得游戏,总费用为 $7 + $3 + $5 = $15 。
      • 如果我的数字更小,则下一步需要猜测的数字范围是 [1,2] 。你可以猜测数字为 1 。
        • 如果这是我选中的数字,你的总费用为 $7 + $3 = $10 。否则,你需要支付 $1 。
        • 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $7 + $3 + $1 = $11 。
          在最糟糕的情况下,你需要支付 $16 。因此,你只需要 $16 就可以确保自己赢得游戏。

示例 2:
输入:n = 1
输出:0
解释:只有一个可能的数字,所以你可以直接猜 1 并赢得游戏,无需支付任何费用。

示例 3:
输入:n = 2
输出:1
解释:有两个可能的数字 1 和 2 。

  • 你可以先猜 1 。
    • 如果这是我选中的数字,你的总费用为 $0 。否则,你需要支付 $1 。
    • 如果我的数字更大,那么这个数字一定是 2 。你猜测数字为 2 并赢得游戏,总费用为 $1 。
      最糟糕的情况下,你需要支付 $1 。

提示:
1 <= n <= 200

求解思路&实现代码&运行结果

暴力递归

求解思路

  1. 为了能够让同学们更好的理解这个过程,我特意将整个思考的过程以及作图的过程都绘制在下面这张图中,希望可以通过下面这张图更好的帮助你理解整个过程,大家可以结合这张图来理解整个题目的求解思路。
    在这里插入图片描述

实现代码

注意,代码的实现方式可以有很多,大家根据自己的习惯来就好

class Solution {
    public int getMoneyAmount(int n) {
        return process(1,n);
    }

    public int process(int left,int right){
        if(left>=right) return 0;
        int min=Integer.MAX_VALUE;
        for(int x=left;x<=right;x++){
            int pay=Math.max(process(left,x-1),process(x+1,right))+x;
            min=Math.min(min,pay);
        }
        return min;
    }
}

运行结果

大家不要看到时间超限就害怕,相反,看到这个我们更应该放心,这是我们期待的结果。

在这里插入图片描述

记忆化搜索

求解思路

  1. 核心思路就是我们上面的求解过程,如果没有理解可以继续看上面的图解过程。
  2. 在原来的基础上加缓存表,将结果进行记录,避免重复计算。

实现代码

class Solution {
    public int getMoneyAmount(int n) {
        int[][] dp=new int[n+5][n+5];
        for(int i=0;i<=n;i++) Arrays.fill(dp[i],-1);
        return process(1,n,dp);
    }

    public int process(int left,int right,int[][] dp){
        if(dp[left][right]!=-1) return dp[left][right];
        if(left>=right) return dp[left][right]=0;
        int min=Integer.MAX_VALUE;
        for(int x=left;x<=right;x++){
            int pay=Math.max(process(left,x-1,dp),process(x+1,right,dp))+x;
            min=Math.min(min,pay);
        }
        return dp[left][right]=min;
    }
}

运行结果

加个缓存表就是香,通过!

在这里插入图片描述

动态规划

求解思路

  1. 同理,核心求解思路我们上面已经讲过了,此处不同的是原来通过递归,此时我们通过dp数组和循环即可完成。

实现代码

继续改进!

class Solution {
    public int getMoneyAmount(int n) {
        int[][] dp=new int[n+5][n+5];
        for(int i=n;i>0;i--){
            for(int j=i+1;j<=n;j++){
                dp[i][j]=Integer.MAX_VALUE;
                for(int x=i;x<=j;x++){
                    dp[i][j]=Math.min(Math.max(dp[x+1][j],dp[i][x-1])+x,dp[i][j]);
                }
            }
        }
        return dp[1][n];
    }
}

运行结果

在这里插入图片描述

共勉

最后,我想送给大家一句一直激励我的座右铭,希望可以与大家共勉!
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【react全家桶学习】初始化react脚手架及项目结构讲解

目录 react 脚手架介绍 创建项目并启动 一、全局安装 npm i create-react-app -g 二、切换到想创项目的目录&#xff0c;使用命令:create-react-app hello-react(自定义项目名) 项目结构介绍 主要分析public-->index.html文件 分析src文件夹 项目执行流程 react …

【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库

文章目录 前言一、软硬链接二、动态库和静态库总结前言 上一篇文章的最后我们讲解了文件的inode&#xff0c;那么文件名和inode有什么区别呢&#xff1f;区别就在于linux系统只认inode号&#xff0c;文件的inode属性中&#xff0c;并不存在文件名&#xff0c;而文件名其实是给…

高级篇二、MySQL的数据目录

笔记连接 1、MySQL8的主要目录结构 find / -name mysql1.1 数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/lib/mysql/ 1.2 相关命令目录 相关命令目录&#xff1a;/usr/bin&#xff08;mysqladmin、mysqlbinlog、mysqldump等命令&#xff09;和/usr/s…

给我拿三桶水来,实在太干了!!!!!来自腾讯学长爆肝总结的纯干货Java面试手册!!!

前言 23年java的行情懂得都懂&#xff0c;有份对口的工作已经很不错了。但经统计在java行业今年只有百分之30的大学生找到了java工作&#xff0c;剩余的还有百分之70不是在面试的路上就是已经只能被迫转行了&#xff01; 而我们去面试的时候也会被一些面试问题给问到&#xff…

DStream是什么?怎样对DStream进行操作?

DStream的本质 DStream(Discretized Stream)是Spark Streaming提供的基本数据抽象。它表示一个连续的数据流&#xff0c;可以是从源接收到的输入数据流&#xff0c;也可以是通过转换输入流生成的已处理数据流。 DStream由一系列连续的RDD表示&#xff0c;每个RDD都包含来自特…

学习黑客十余年,如何成为一名高级的安全工程师?

1. 前言 说实话&#xff0c;一直到现在&#xff0c;我都认为绝大多数看我这篇文章的读者最后终究会放弃&#xff0c;原因很简单&#xff0c;自学终究是一种适合于极少数人的学习方法&#xff0c;而且非常非常慢&#xff0c;在这个过程中的变数过大&#xff0c;稍有不慎&#…

LONG LIVE KEJU! THE PERSISTENT EFFECTS OF CHINA’S CIVIL EXAMINATION SYSTEM

LONG LIVE KEJU! The persistent effects of China’s civil examination system(Ting Chen et al) – 论文精读 总览方法论 本文研究了古代科举制度对当代人力资本的持续性影响。 本文最值得关注的是工具变量的选取&#xff0c;选取了各县到最近的竹子和松柏产地的最短河流…

归并排序(递归+非递归)

目录一、什么是归并排序&#xff1f;二、归并排序&#xff08;递归&#xff09;三、归并排序&#xff08;非递归&#xff09;一、什么是归并排序&#xff1f; 归并排序&#xff0c;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff08;Divide and Conquer&a…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

【redis】缓存双写一致性之更新策略探讨(上)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

移动通信技术的毫米波波束成形系统构成

随着通信产业尤其是移动通信的高速发展&#xff0c;无线电频谱的低端频率已趋饱和。采用各种调制方法或多址技术扩大通信系统的容量&#xff0c;提高频谱的利用率&#xff0c;也无法满足未来通信发展的需求&#xff0c;因而实现高速、宽带的无线通信势必向微波高频段开发新的频…

No.035<软考>《(高项)备考大全》【第19章】流程管理

【第19章】流程管理1 章节相关2流程管理基础3 流程分析、设计、实施与评估4 流程重构与改进5 项目管理流程的管理和优化6 练习题参考答案1 章节相关 本章节看一遍即可。 2流程管理基础 ★1、BPM是一种以规范化的构造端到端的卓越业务流程为中心&#xff0c;以持续的提高组织…

Springboot基础学习之(十九):通过Mybatis和shiro框架实现授权功能

在shiro整合mybatis实现认证功能 在此篇文章的基础上实现授权的功能&#xff1a;对网页的访问设置权限&#xff0c;只有登录的用户具有该网页的访问权限才能够访问此网页&#xff0c;那篇文章已经将系统的环境全都配好了&#xff0c;只需要在完善功能即可&#xff0c;所以关于项…

怎么入驻Tik Tok的跨境MCN机构呢?

TIKTOK强势崛起&#xff0c;跨境MCN成黄金赛道 社交媒体格局的改变&#xff0c;往往体现在青少年身上。面对TIKTOK的强势崛起&#xff0c;全球社媒霸主Facebook已经出现衰落的趋势。 据相关数据显示&#xff0c;TIKTOK目前有四分之一的用户都是二十岁一下的青少年&#xff0c;拥…

大公司的okr管理- 氛围 + 月历

OKR之剑实战篇06&#xff1a;OKR致胜法宝-氛围&业绩双轮驱动&#xff08;下&#xff09;_vivo互联网技术的博客-CSDN博客 先说说氛围。组织氛围的提出者库尔特勒温被尊为“社会心理学之父”&#xff0c;他的核心理论非常通俗易懂&#xff0c;决定人类行为的&#xff0c;不是…

TK4860E交流充电桩检定装置

TK4860系列是专门针对现有交流充电桩现场检测过程中接线复杂、搬运困难、检测效率低、成本投入高等问题而研制的一系列高效检测仪器&#xff0c;旨在更好的开展充电桩的强制检定工作。 TK4860E交流充电桩检定装置是其中一款专用于现场检定电动汽车单相充电桩的一体式便携式仪器…

236页10万字精选数据中台建设方案2022版(word)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 1. 数据中台建设方案 1.1. 总体建设方案通过对客户大数据应用平台服务需求的理解&#xff0c;根据建设目标、设计原则的多方面考虑&#xff0c;建议采用星环科技Transwarp Data…

JAVA局域网飞鸽传书软件设计与实现

本文的目标是设计一个类似飞鸽传输的局域网通信软件&#xff0c;并分析它在其领域的优势。本设计以C编 写&#xff0c;能在windows 2000/net/xp等环境下运行。设计共分为五大模块&#xff0c;分别是&#xff1a;首先&#xff0c;介绍选题背景及意义和国内外研究现状&#xff1b…

【id:31】【20分】A. Point(类与构造)

题目描述 下面是一个平面上的点的类定义&#xff0c;请在类外实现它的所有方法&#xff0c;并生成点测试它。 输入 测试数据的组数 t 第一组测试数据点p1的x坐标 第一组测试数据点p1的y坐标 第一组测试数据点p2的x坐标 第一组测试数据点p2的y坐标 .......... 输出 输出…

阿里都在用的线上问题定位工具【收藏备用】

简介 Arthas 是Alibaba开源的Java诊断工具&#xff0c;动态跟踪Java代码&#xff1b;实时监控JVM状态&#xff0c;可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 。支持JDK 6&#xff0c;支持Linux/Mac/Windows。这个工具真的很好用&#xff0c;而且入门超简单&…