wy的leetcode刷题记录_Day48

news2024/11/23 18:42:35

wy的leetcode刷题记录_Day48

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2022-11-21

前言

补前几天的blog

目录

  • wy的leetcode刷题记录_Day48
    • 声明
    • 前言
    • 808. 分汤
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 654. 最大二叉树
      • 题目介绍
      • 思路
      • 代码
      • 收获

808. 分汤

今天的每日一题是:808. 分汤

题目介绍

有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作:

  • 提供 100ml 的 汤A 和 0ml 的 汤B 。
  • 提供 75ml 的 汤A 和 25ml 的 汤B 。
  • 提供 50ml 的 汤A 和 50ml 的 汤B 。
  • 提供 25ml 的 汤A 和 75ml 的 汤B 。

当我们把汤分配给某人之后,汤就没有了。每个回合,我们将从四种概率同为 0.25 的操作中进行分配选择。如果汤的剩余量不足以完成某次操作,我们将尽可能分配。当两种类型的汤都分配完时,停止操作。

注意 不存在先分配 100 ml 汤B 的操作。

需要返回的值: 汤A 先分配完的概率 + 汤A和汤B 同时分配完的概率 / 2。返回值在正确答案 10-5 的范围内将被认为是正确的。

示例 1:
输入: n = 50
输出: 0.62500
解释:如果我们选择前两个操作,A 首先将变为空。 对于第三个操作,A 和 B会同时变为空。 对于第四个操作,B 首先将变为空。 所以 A 变为空的总概率加上 A 和 B 同时变为空的概率的一半是 0.25 *(1 +1 + 0.5 + 0)= 0.625。

示例 2:
输入: n = 100
输出: 0.71875

思路

方法一:动态规划:
1、确定dp数组的含义:dp[i][j]表示A还剩下i份,B还剩下j份的概率值。
2、确定dp数组的递推公式:由题目可知可从四个方面推当前阶段,这里我们的顺序是从0向n份开始推,这也是由我们的递推公式所决定的,四个方面是

  • 4份A+0份B
  • 3份A+1份B
  • 2份A+2份B
  • 1份A+3份B

所以我们的递推公式就应该是:

                dp[i][j] = (dp[max(0, i - 4)][j] + dp[max(0, i - 3)][max(0, j - 1)] +dp[max(0, i - 2)][max(0, j - 2)] + dp[max(0, i - 1)][max(0, j - 3)]) / 4.0;//来自四个状态:4A+0B,3A+1B,2A+2B,1A+3B

这里我们用了max,是为了在i和j小于四份的时候表达出仍然按上面四个方面卖,但是可能货量不够但是要尽可能卖出去,也就是为负数了,而数组下标又没有负数所以我们使用max来时程序能够运行。

代码

dfs记忆化搜索:很像之前学的树遍历中的dfs不过这里遍历的方式相似不过规则不同而已,缺点是多次重复计算了dp和调用dfs,其实用一个数组去记录就可以了。

class Solution {
public:
    double soupServings(int n) {
        
        n = ceil((double) n / 25);
        if (n >= 179) {
            return 1.0;
        }
        vector<vector<double>> memory(n + 1, vector<double>(n + 1));
        return dfs(n, n, memory);
    }

    double dfs(int a, int b,vector<vector<double>> &memo) {
        if (a <= 0 && b <= 0) {
            return 0.5;
        } else if (a <= 0) {
            return 1;
        } else if (b <= 0) {
            return 0;
        }
        if (memo[a][b] > 0) {
            return memo[a][b];
        }
        memo[a][b] = 0.25 * (dfs(a - 4, b,memo) + dfs(a - 3, b - 1,memo) + 
                             dfs(a - 2, b - 2,memo) + dfs(a - 1, b - 3,memo));
        return memo[a][b];
    }

};


动态规划:相较于dfs的记忆化搜索省去了不少空间和时间

class Solution {
public:
    double soupServings(int n) {
        n = ceil((double) n / 25);//量化减小 变成分批 每25ml分成一批
        if(n>=179)//由于题目要求保留五位 经过计算后发现再批次大于179之后无限接近于1
            return 1;
        vector<vector<double>> dp(n+1,vector<double>(n+1));

        dp[0][0]=0.5;//0 0 表示A 和B同时分配完
        for(int i=1;i<=n;i++)
        {
            dp[0][i]=1.0;//A先被分配完 B仍由残留  
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j] = (dp[max(0, i - 4)][j] + dp[max(0, i - 3)][max(0, j - 1)] +dp[max(0, i - 2)][max(0, j - 2)] + dp[max(0, i - 1)][max(0, j - 3)]) / 4.0;//来自四个状态:4A+0B,3A+1B,2A+2B,1A+3B
            }
        }
        return dp[n][n];

    }
};

收获

巩固了动态规划的知识,以及在处理递推时的一些小技巧。

654. 最大二叉树

654. 最大二叉树

题目介绍

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 。

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

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:

  • [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    • [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
      • 空数组,无子节点。
      • [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
        • 空数组,无子节点。
        • 只有一个元素,所以子节点是一个值为 1 的节点。
    • [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
      • 只有一个元素,所以子节点是一个值为 0 的节点。
      • 空数组,无子节点。 示例 2:

示例 2:
在这里插入图片描述
输入:nums = [3,2,1]
输出:[3,null,2,null,1]

思路

简单的模拟题,使用递归思路,根据题意找到数组中最大的值和其下标,并根据这个最大的值以此创建一个节点,根据这个下标分割数组将其分为左右俩部分,也就是左右子树,分别作为下一次迭代的输入参数。递归出口就是当数组大小为1的时候就是递归到叶子节点的时候直接将创建的节点返回就可以。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        int n=nums.size();
        if(n==0)
            return nullptr;
        if(n==1)
            return new TreeNode(nums[0]);
        int maxVal=0;
        int maxIndex=0;
        for(int i=0;i<n;i++)
        {
            if(nums[i]>maxVal)
            {
                maxVal=nums[i];
                maxIndex=i;
            }
        }
        TreeNode* newNode=new TreeNode(maxVal);
        if(maxIndex>0)
        {
            vector<int> num_left(nums.begin(),nums.begin()+maxIndex);
            newNode->left=constructMaximumBinaryTree(num_left);
        }
        if(maxIndex<n-1)
        {
            vector<int> num_left(nums.begin()+maxIndex+1,nums.end());
            newNode->right=constructMaximumBinaryTree(num_left);
        }
        return newNode;
    }
};

收获

递归思路

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

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

相关文章

Boc-QAR-AMC,CAS号:201849-55-0/113866-20-9

胰蛋白酶的高反应性底物&#xff0c;前列腺素和matriptase的荧关底物 编号: 199467中文名称: 标记肽Boc-QAR-7-氨基-4-甲基香豆素.HCl英文名: Boc-Gln-Ala-Arg-AMCCAS号: 201849-55-0/113866-20-9单字母: Boc-QAR-AMC三字母: Boc-Gln-Ala-Arg-AMC氨基酸个数: 3分子式: C29H42O8…

低代码维格云常用组件入门教程

1. 维格云常用组件功能简介 工作区的成员可以根据自己的业务习惯,将工作区内的应用、门户添加到常用组件。添加后成员可以直接从门户的常用组件中操作相应的应用、门户 2. 维格云常用组件配置方式 2.1 添加常用组件 在门户中拖拽或点击添加常用组件2.2 设置组件标题 在右侧编…

中学化学教学参考杂志社中学化学教学参考编辑部2022年第15期目录

刊庆专稿 试论“文化化学”教学思想的实践意义与样态 刘英琦; 1-4 课改在线《中学化学教学参考》投稿&#xff1a;cn7kantougao163.com 凝练观念 重构实践 引领评价——谈《义务教育化学课程标准(2022年版)》的修订 周青; 4-6 领悟化学课程的育人标准——基于《义务…

阿里、字节等神创,必须是全网最全的Netty核心原理手册

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

【SpringBoot笔记28】SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)

这篇文章&#xff0c;主要介绍SpringBoot集成ES数据库之操作doc文档&#xff08;创建、更新、删除、查询&#xff09;。 目录 一、SpringBoot操作ES文档数据 1.1、创建文档 1.2、更新文档 1.3、删除文档 1.4、查询文档 1.5、判断文档是否存在 1.6、批量创建文档 一、Spr…

高手系列!数据科学家私藏pandas高阶用法大全 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/394 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置

neozng1hnu.edu.cn 本教程的示例代码是笔者参加RoboMaster机甲大师赛为机器人编写的控制器框架&#xff0c;你可以直接克隆仓库&#xff0c;阅读仓库下的Markdown文档获得更好的体验&#xff0c;记得点一个小⭐: basic_framework: basic_framework (gitee.com)所有安装包也可以…

OceanBase TableAPI实践案例(Rust)

引子 这是OceanBase TableAPI实践案例&#xff08;Java&#xff09;的姊妹篇&#xff0c;上一篇比较全面的比较全面的介绍了TableAPI的相关概念&#xff0c;以及基本的环境搭建&#xff0c;因此这篇不再赘述。本文将主要介绍TableAPI的Rust客户端obkv-table-client-rs &#x…

Visio画图更改连接线的弧形和调整跨线

目录前言准备参考问题解决问题一解决问题二前言 最近在使用Visio画图时&#xff0c;出现了一些问题&#xff0c;于是上网查了一下&#xff0c;将方法记录下来。 准备 Visio2021 参考 Visio中&#xff0c;如何修改连接线的跨线样式&#xff1f; 问题 (1) 使用连接线的时候…

【微信小程序】使用 Cryptojs 解密微信绑定手机号码

很抱歉断更了一段时间&#xff0c;因为最近在做一个项目比较忙&#xff0c;正好项目中小程序板块需要解密手机号码来提交给接口&#xff0c;小程序中虽然提供了获取手机号按钮点击事件&#xff1a;bindgetphonenumber&#xff0c;但是该事件的处理函数中只能获取到加密过的手机…

新力量,新希望|明道云伙伴大会2022秋圆满落幕

2022年10月28日至29日&#xff0c;明道云伙伴大会&#xff08;2022年秋&#xff09;在上海顺利举办。来自北京大兴国际机场、广汽本田、京东方、天津钢管、深圳龙华区卫健局、可口可乐、山东移动、浙江移动、上海电气数科、金科信息、艾默生电气等超过五百位参会者同台交流。行…

工业物联网的数据集成

随着网关技术的不断发展&#xff0c;创新、高效的软件解决方案及IT架构在工业物联网系统架构中将发挥着更为重要的作用。其中&#xff0c;工业物联网集成工业数据的一个关键问题在于如何利用软件、IT和创新算法来部署网络解决方案&#xff0c;从而使得生产效率更高。 &#xff…

Java中 this 和 super 的用法与区别

在Java的学习与开发者我们经常遇到this和super关键字&#xff0c;那么它们的用法和区别是什么呢&#xff1f; 一、this关键字 1.this是什么&#xff1f; this 是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。 2.this…

javaScript之数组中reduce的详细介绍及使用

一、reduce功能接受及定义&#xff08;自我理解&#xff09; reduce方法为数组中的一个高阶函数&#xff0c;接受两个参数&#xff0c;第一个参数为回调函数&#xff0c;第二个为初始值。如果不给入初始值则会以数组第一项为初始值&#xff01;reduce会循环数组每一项&#xf…

数据库-深度剖析mysql索引原理(上)(三)

目录 一、什么是索引 二、索引由来 三、索引本质 四、索引数据结构 1、hsah 2、Btree 五、myISAM 和Innodb这两个数据库的索引是如何实现的呢&#xff1f; 1、首先看 MYSAM 1、以主键Id字段建立索引 2、以name字段来建立索引 2、在看Innodb数据库引擎的数据库 1、以…

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK&#xff08;适用于各个版本&#xff09;_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题&#xff1a;在比特币中&#xff0c;怎么证明这个交易是你发布的&#xff1f; 这是就需要用到数字…