wy的leetcode刷题记录_Day43

news2024/10/2 16:16:14

wy的leetcode刷题记录_Day40

声明

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

前言

今天时间比较多而且题目比较简单,应该能写三四道题。

目录

  • wy的leetcode刷题记录_Day40
    • 声明
    • 前言
    • 1710. 卡车上的最大单元数
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 513. 找树左下角的值
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 112. 路径总和
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 113. 路径总和 II
      • 题目介绍
      • 思路
      • 代码
      • 收获

1710. 卡车上的最大单元数

今天的每日一题是:1710. 卡车上的最大单元数

题目介绍

请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi] :

  • numberOfBoxesi 是类型 i 的箱子的数量。
  • numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。

整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。

返回卡车可以装载 单元 的 最大 总数。

示例 1:
输入:boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4
输出:8
解释:箱子的情况如下:

  • 1 个第一类的箱子,里面含 3 个单元。
  • 2 个第二类的箱子,每个里面含 2 个单元。
  • 3 个第三类的箱子,每个里面含 1 个单元。 可以选择第一类和第二类的所有箱子,以及第三类的一个箱子。 单元总数 = (1 * 3) + (2 * 2) + (1 * 1) = 8

示例 2:
输入:boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10
输出:91

思路

方法一:一个简单的贪心思路:先将boxTypes按照其numberOfUnitsPerBoxi的大小排列顺序,然后根据其数量装箱,到最后只有俩种情况,就是该类型的箱子数量>剩下所需的箱子数量,这样的话只需把剩下所需的箱子数量的该类型的箱子放入即可;还有就是该类型的箱子数量<剩下所需的箱子数量,这样就需要将该类型的箱子全部放入后,继续放入下一个类型的箱子。
方法二:由于本题目的数据量较小,所以可以创建一个空的数组truck,通过遍历boxTypes,填充这个数组,下标为其箱子能装载的单元数量,值为箱子的数量。最后从后往前再遍历这个truck,也就是从最大的箱子能装载的单元数量开始放入。(这样的话相比于方法一的排序时间复杂度要低一些的)

代码

贪心:

class Solution {
public:
    int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
        //
        int ans=0;
        if(boxTypes.empty())
            return ans;
        sort(boxTypes.begin(), boxTypes.end(), [](const vector<int> &a, const vector<int> &b) {
            return a[1] > b[1];
        });
        int j=0;
        for(auto boxType:boxTypes)
        {
            int box_num=boxType[0];
            int box_val=boxType[1];
            
            if(box_num<=truckSize)
            {
                ans+=box_num*box_val;
                truckSize-=box_num;
            }

            else
            {
                ans+=truckSize*box_val;
                break;
            }


        }
        return ans;
    }
};

计数排序:

class Solution {
public:
    int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
        int truck[1001] = {0};
        for (auto& boxType : boxTypes) {
            int numberOfBoxesi  = boxType[0], numberOfUnitsPerBoxi  = boxType[1];
            truck[numberOfUnitsPerBoxi ] += numberOfBoxesi ;
        }
        int ans = 0;
        for (int numberOfUnitsPerBoxi = 1000; numberOfUnitsPerBoxi > 0 && truckSize > 0; --numberOfUnitsPerBoxi) {
            int numberOfBoxesi = truck[numberOfUnitsPerBoxi];
            if (numberOfBoxesi) {
                ans += numberOfUnitsPerBoxi * min(truckSize, numberOfBoxesi);
                truckSize -= numberOfBoxesi;
            }
        }
        return ans;
    }
};



收获

简单的模拟贪心思路,以及再数据量小的时候可以稍微牺牲一下空间性能来提升时间性能

513. 找树左下角的值

513. 找树左下角的值

题目介绍

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

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

示例 2:
在这里插入图片描述
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

思路

方法一:DFS:前序遍历,维护一个最大深度和最大深度左节点值就可以
方法二:BFS:记录层次,遍历到最深层次后第一个值就是树左下角的值

代码

DFS:

/**
 * 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:
        int maxLen = INT_MIN;
        int maxleftValue;
        void traversal(TreeNode* root, int leftLen) 
        {
            if (root->left == NULL && root->right == NULL) 
            {
                if (leftLen > maxLen) 
                {
                    maxLen = leftLen;
                    maxleftValue = root->val;
                }
                return;
            }
            if (root->left)
             {
                traversal(root->left, leftLen + 1); // 隐藏着回溯
            }
            if (root->right) 
            {
                traversal(root->right, leftLen + 1); // 隐藏着回溯
            }
            return;
            }

        int findBottomLeftValue(TreeNode* root) {
            traversal(root, 0);
            return maxleftValue;
    }
};

BFS:

/**
 * 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:
    int findBottomLeftValue(TreeNode* root) {
        int ans=0;
        queue<TreeNode*> qu;
        if(!root)
            return ans;
        qu.push(root);
        while(!qu.empty())
        {
            int n=qu.size();
            for(int i=0;i<n;i++)
            {
                TreeNode* node=qu.front();
                qu.pop();
                if(i==0)
                    ans=node->val;
                if(node->left)
                    qu.push(node->left);
                if(node->right)
                    qu.push(node->right);
            }
        }
        return ans;
    }

};

收获

熟练了BFS和DFS对各种要求的应用

112. 路径总和

112. 路径总和

题目介绍

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:
在这里插入图片描述
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

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

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:

  • (1 -->2): 和为 3
  • (1 --> 3): 和为 4

不存在 sum = 5 的根节点到叶子节点的路径。

思路

本题方法太多了,我这里只写了一个用栈来模拟递归的方法。

代码

/**
 * 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:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root)
            return false;
        stack<pair<TreeNode *,int>> path;
        path.push({root,root->val});
        
        while(!path.empty())
        {
            pair<TreeNode *,int> node=path.top();
            path.pop();
            if (!node.first->left && !node.first->right && targetSum == node.second) 
                return true;
            if (node.first->left) {
                path.push(pair<TreeNode*, int>(node.first->left, node.second +
                node.first->left->val));
            }
            // 右节点,压进去⼀个节点的时候,将该节点的路径数值也记录下来
            if (node.first->right) {
                path.push(pair<TreeNode*, int>(node.first->right, node.second +
                node.first->right->val));
            }
        }
        return false;
        }
    
};

收获

对调用系统栈的方式更加了解。

113. 路径总和 II

113. 路径总和 II

题目介绍

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:
在这里插入图片描述
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

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

思路

BFS:这一题使用BFS还是有一些麻烦的,因为当你遍历到符合要求的叶子节点时,你需要去找到他的链路,就是根据他的父节点依次向上寻找,于是我额外使用了一个hashmap来记录每个节点的父节点。
DFS:用一个临时path来记录当前遍历的路径,并且在不符合条件回退时path也要进行回溯。

代码

BFS:

/**
 * 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:
    vector<vector<int>> ans;
    unordered_map<TreeNode* ,TreeNode*> parent;
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {

        if(!root)
            return ans;
        queue<pair<TreeNode*,int>> qu;
        qu.push({root,root->val});
        while(!qu.empty())
        {
            pair<TreeNode*,int> node=qu.front();
            qu.pop();
            if(!node.first->left&&!node.first->right&&node.second==targetSum)
                getPath(node.first);
            else
           {
                if(node.first->left)
                {
                    parent[node.first->left]=node.first;
                    qu.push({node.first->left,node.second+node.first->left->val});
                }

                if(node.first->right)
                {
                    parent[node.first->right]=node.first;
                    qu.push({node.first->right,node.second+node.first->right->val});
                }            
            }
        }
        return ans;
    }

    void getPath(TreeNode* node) {
        vector<int> tmp;
        while (node != nullptr) {
            tmp.emplace_back(node->val);
            node = parent[node];
        }
        reverse(tmp.begin(), tmp.end());
        ans.emplace_back(tmp);
    }
};

DFS:

class Solution {
public:
    vector<vector<int>> ret;
    vector<int> path;

    void dfs(TreeNode* root, int targetSum) {
        if (root == nullptr) {
            return;
        }
        path.emplace_back(root->val);
        targetSum -= root->val;
        if (root->left == nullptr && root->right == nullptr && targetSum == 0) {
            ret.emplace_back(path);
        }
        dfs(root->left, targetSum);
        dfs(root->right, targetSum);
        path.pop_back();
    }

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        dfs(root, targetSum);
        return ret;
    }
};


收获

其实这俩道题已经有较明显的回溯意思了,稍微掌握了一些。

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

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

相关文章

Spectacle源码编译方法

一、简介 Spectacle 是一个用于抓取桌面截图的简单应用程序。它可以抓取整个桌面、单个显示器、当前活动窗口、鼠标所在的窗口或是屏幕上的一块矩形区域的图像。截取的图像可被打印、发送到其他应用程序进行处理、或是直接保存下来。 Spectacle是archlinux wiki中推荐KDE使用…

刘二大人CNN

10.卷积神经网络&#xff08;基础篇&#xff09;_哔哩哔哩_bilibili 0、前一部分 卷积层 和 subsampling 叫做Feature Extraction特征提取器&#xff0c;后一部分叫做classification 1、每一个卷积核它的通道数量要求和输入通道是一样的。这种卷积核的总数有多少个和你输出通…

SpringBoot+Vue项目医院挂号系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

2.6 自定义srv python

功能介绍 以自定义数据类型为基础&#xff0c;完成一个节点作为服务器&#xff0c;另一个节点接收传送两个数字到服务端&#xff0c;服务端计算后反馈到客户端进行打印输出 1、工作空间 1.1 创建工作空间lee_ws mkdir -p ~/lee_ws/src cd ~/lee_ws/src/ catkin_init_worksp…

leetcode134.加油站 贪心法求解 (c++版本)

题目描述 题目比较长&#xff0c;明确以下这点就可以 gas数组是当前下标i加油站所能加的油cost数组是从当前下标i加油站到下一加油站所消耗的油那么gas [i]与cost [i] 的大小就决定了车辆能否从当前加油站出发到达下一加油站 上面三点非常重要是能正确做出题目的必须要求 其实…

字符流,编码表,字符流写数据,字符流读数据

文章目录前言字符流编码表字符串中的编码解码问题字符流写数据字符流读数据总结前言 因为近期考试原因&#xff0c;还有自身惰性的问题&#xff0c;小编最近停更了一段时间&#xff0c;随之而来的罪恶感让我又开启了自学与创作之路&#xff0c;学习这么久&#xff0c;自己虽然…

来源稳定的l2逐笔接口数据去哪找?

l2逐笔接口的逐笔数据的最初来源均是从交易所获取&#xff0c;其授予了一些信息服务商L2非展示数据接口转发权限&#xff0c;其中包含了逐笔成交、逐笔委托等数据。使用时&#xff0c;通常是从信息商处购买&#xff0c;比如同花顺、万得、国泰安等等。那么小编认为通过交易所授…

mysql中find_in_set()函数的使用及in()用法详解

MySQL手册中find_in_set函数的语法解释&#xff1a; FIND_IN_SET(str,strlist) str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22) 查询字段(strlist)中包含(str)的结果&#xff0c;返回结果为null或记录 假如字符串str在由N个子链组成的字符串列表strli…

Linux:rpm与yum(内含:1.rpm介绍+2.卸载rpm包+3.安装rpm(应用案例)+4.yum(应用案例))

1.rpm介绍使用: 实例&#xff1a;查看当前系统是否安装了 firefox &#xff0c;操作如下&#xff1a; 解释&#xff1a; 名称&#xff1a;firefox 版本号&#xff1a;91.11.0-2 使用操作系统&#xff1a;el7.centos.x86_64 表示centos.x的64位系统。 查询软件包是否安装&#…

跨境电商卖家必知的9个圣诞节营销技巧

关键词&#xff1a;跨境电商卖家、圣诞节营销 圣诞节——对跨境电商卖家来说是非常重要的促销节日。根据以往的经验&#xff0c;您或许已经有了初步的促销想法&#xff0c;想知道您今年的跨境电子商务营销策略是否正确&#xff1f;为您整理了跨境电商卖家必须注意的营销技巧&am…

TiDB数据库架构——TiDB Server

TiDB Server架构 TiDB Server 是SQL层&#xff0c;无状态&#xff0c;启动多个TiDBServer&#xff0c;均匀分摊&#xff0c;解析SQL&#xff0c;获取真实数据。 Protocol Layer、&#xff1a;负责客户端的连接。 Parse、Compile&#xff1a;负责SQL语句的解析和编译&#xff…

信息控制信息卷积

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景

少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年9月

目录 2022年9月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 推荐资料

java学生作业带选课管理系统ssh

1.管理员具有对学校课程信息&#xff0c;教师信息&#xff0c;学生信息增删改查的权限 &#xff08;1&#xff09;可以录入学校所开课程&#xff0c;学生信息&#xff0c;教师信息&#xff1b; &#xff08;2&#xff09;可以对教师的开课信息进行增加&#xff0c;删除&#xf…

什么是 DeGods NFT 系列?

Nov. 2022, Vincy Data Source: Footprint Analytics - DeGods NFT Collection DeGods 系列有 10,000 个 Solana 铸造头牌的 NFT。 DeGods 持有者拥有访问 DeDAO 的权限和社区。 它在 1 月推出 DUST 协议&#xff0c;允许持有者质押他们的 DeGods NFT 并赚取 DUST。 10 月 …

cmake 工具 三 add_libary, set_target_properties,link_libary, target_link_libary

一起通过一个例子学一下 add_libary&#xff0c; set_target_properties&#xff0c;link_libary&#xff0c; target_link_libary 四个命令 首先创建如下的文件&#xff1a; 其中 build用于cmake编译&#xff0c;防止大量编译的中间文件污染代码文件夹具体可见cmake 构建工具…

手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图片不满足

上图是近期小编与一位店主的聊天截图&#xff0c;从截图中我们可以知道&#xff0c;这位店主在使用复制软件来复制宝贝上传时出现了一些问题&#xff0c;下面&#xff0c;小编将上传出现的错误、分析过程及解决方法列示如下&#xff0c;希望能给其他店主一些帮助&#xff1a;查…

批量图片压缩怎么做?分享三招图片压缩怎么操作的方法

因为工作需要在电脑上保存大量图片的小伙伴们&#xff0c;是不是图片一下子把电脑内存占满了&#xff0c;可是要怎么做才能减少图片的占用空间呢&#xff1f;我们可以把图片压缩&#xff0c;这样子就可以保存更多的图片啦。还不清楚批量图片压缩怎么做的小伙伴们&#xff0c;让…

光点数据中台,解决高校信息整合难题_光点科技

目前&#xff0c;国家和相关部门对教育信息化高度重视&#xff0c;先后出台了多项政策和文件&#xff0c;要求加快教育信息化的发展步伐&#xff0c;高校信息化进入了快速发展期。 在此背景下&#xff0c;数据也将会成为高校信息化的核心资产&#xff0c;并对高校信息化的快速发…

【Big Data】解决Hive查询出现Java.lang.OutMemoryError.java heap space

一、Introduction 在使用Hive时&#xff0c;出现了以下的问题 错误的原因是资源分配不够&#xff0c;但是错误的原因有很多&#xff0c;需要去查看日志文件观察具体的错误。 日志文件位置在 /tmp/root/hive.log 由此我们知道具体的错误原因是JVM资源分配不够 接下来可以尝试…