秋招突击——6/16——复习{(单调队列优化DP)——最大子序和,背包模型——宠物小精灵收服问题}——新作{二叉树的后序遍历}

文章目录

    • 引言
    • 复习
      • (单调队列优化DP)——最大子序和
        • 单调队列的基本实现思路——求可移动窗口中的最值
        • 总结
      • 背包模型——宠物小精灵收服问题
        • 思路分析
        • 参考思路分析
    • 新作
      • 二叉树的后续遍历加指针调换
    • 总结

引言

复习

(单调队列优化DP)——最大子序和

  • 这个已经是第二天做了,昨天基本上已经做了很多推理,今天就要把这道题完成,下述是昨天的学习的链接
  • 单调递增队列的推理
  • 昨天经过推理,知道了要将这个问题进行转换,由原先的特定长度和的最大值,转成求特定长度和的最小值。然后通过画图证明了,为什么要通过单调队列实现最小值的计算。
  • 今天主要是关注代码的执行。
单调队列的基本实现思路——求可移动窗口中的最值
  • 使用队列维系一个集合m
  • 将无用的元素从后往前进行排除,保证队列是一个单调递增的队列
  • 找出最大值或者最小值

在这里的队列保存的元素是的特定序列的累加和,不是具体的元素的大小,保证单调递增!!

  • 这个代码不是那么好懂,我自己再写一遍。
#include <iostream>

using namespace std;

typedef long long LL;
const int N = 300010;
int q[N],s[N];
int n,m;

int main(){
    cin>>n>>m;
    for (int i = 1; i <= n ; ++i) {
        cin>>s[i];
        s[i] += s[i - 1];
    }

    // 创建对应的队列
    int hh = 0,tt = 0,res = INT_MIN;
    q[hh] = 0;
    for (int i = 1; i <= n; ++i) {
        // 保证队列的长度不变
        if (i - hh > m) hh++;
        // 计算最值
        res = max(res , s[i] - s[q[hh]]);
        
        // 更新的队列尾部
        // 队列可为空,也就是tt >= hh
        // 然后就是保证队列是单调递增的,如果出现新的值小于后续的值,
        // 就要将所有比之大的数据排除,因为是一个序列,一定会选中这个数据
        while(tt >= hh && s[q[tt]] > s[i]) tt --;
        // 移动到一个小于或者等于的数字之后,tt再往后移动一个,即将新的排序值,加入其中。
        q[++tt] = i;        
    }
    
    cout<<res;
}
总结
  • 重新写了一遍,效果好多了,并没有像之前那么难以理解了,主要有两个地方需要好好整理一下,分别是
    • 这里的单调递增是针对S,也就是每一个前序和来说的,不是针对特定的某一个元素说的。
    • 这里使用一个数组模拟队列,hh模拟队列的头指针,tt模拟队列的尾指针
      • hh头指针只需要保证是最小值,并且队列的长度不超过m
      • tt尾指针需要覆盖新的元素,保证整个队列是单调递增的,因为这是一个序列和,如果后续的序列和比前面的小,那么最终就不一定不会选择前面的序列和。

背包模型——宠物小精灵收服问题

在这里插入图片描述
在这里插入图片描述

思路分析
  • 这道题是经典的背包模型问题,收服的精灵就是要求在特定空间下装的货越多,然后的皮卡丘收到的伤害就是代价越小越好,

  • 每一个状态的集合,主要分为两个部分,收取当前的精灵和不收取当前的精灵,而且要同时满足两个约束的,就是最多收服精灵的个数,皮卡丘最少收到的伤害,不过究竟哪个更加重要?明白了,尽可能多的精灵,然后同样多的情况下,保证尽可能多的剩余体力。所以,这里要两个矩阵

    • 一个保存数量,这个属性值,也是dp的主要目标
    • 另外一个保存剩余的体力值,这个用来后续判断
  • 感觉有点不对,这里是不是要再增加一个新的遍历条件,也就是体力值?如果不增加就没有意义了。

  • 暂时实现成这样了,还有点问题,不过时间不够了,直接看代码了

#include <iostream>

using namespace std;

const int N = 1010,M = 505,K = 105;  // N是精灵球的数量,M是皮卡丘的体力值,K是野生小精灵的数量
int f[K][N],mr[K][N],n1[K],m1[K];
int n,m,k;
int main(){
    cin>>n>>m>>k;
    for (int i = 1; i < k; ++i) {
        cin>>n1[i]>>m1[i];
    }

    // 遍历对应的数据
    for (int i = 1; i < k; ++i) {
        for (int j = 0; j < N; ++j) {
            f[i][j] = 0;
            // 两种状态,
            // 一种是收服当前的精灵,f[i-1][j - n1[i]] + 1
            // 判定当前剩余的体力以及精灵球的数量是否满足要求
            if (m >= m1[i] && k >= n1[i])
                f[i][j] = f[i-1][j - n1[i]] + 1;

            // 另外一种是不收服当前的精灵,f[i-1][j]
            int temp = f[i-1][j];
            if (temp > f[i][j]){
                // 不收服的结果大于当前的结果
                f[i][j] = temp;
            }else{
                m -= m1[i];
                n -= n1[i];
            }
        }
    }

    // 输出最终的结果,遍历一下

}
参考思路分析
  • 这里是二维背包问题,需要考虑两个维度,所以我上面的思路有问题,应该使用二维背包去解决这个问题。
  • 这里先直接贴代码,参考分析一下
    • 二维背包,然后使用滚动数组进行优化
    • 然后遍历最后一个维度下,精灵球最多的情况下,体力值消耗最小的情况。
  • 还是得看看之前的背包问题咋写的,一维和二维之间的相互转换。
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 1010, K = 510;

int n, m, t;
int v1[N], v2[N];
int f[M][K];

int main()
{
    //input
    cin >> m >> t >> n;
    for (int i = 1; i <= n; ++ i) cin >> v1[i] >> v2[i];

    //dp
    for (int i = 1; i <= n; ++ i)
    {
        for (int j = m; j >= v1[i]; -- j)
        {
            for (int k = t - 1; k >= v2[i]; -- k)
            {
                f[j][k] = max(f[j][k], f[j - v1[i]][k - v2[i]] + 1);
            }
        }
    }

    //output
    cout << f[m][t - 1] << " ";
    //找到满足最大价值的所有状态里,第二维费用消耗最少的
    int cost_health = t;
    for (int k = 0; k <= t - 1; ++ k)
    {
        if (f[m][k] == f[m][t - 1])
        {
            cost_health = min(cost_health, k);
        }
    }
    cout << t - cost_health << endl;
    return 0;
}

作者:一只野生彩色铅笔
链接:https://www.acwing.com/solution/content/52741/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

新作

  • 今天晚上会进行的某公司的主管面,今天新做的题目就是主管面的手撕算法题。

二叉树的后续遍历加指针调换

  • 这道题吃亏在于我没有看清楚题目,没有理解他的题目,我觉得他说的比较混乱,而且有一个东西感觉没有任何意义。
  • 不过我也发现我的问题了,二叉树定义哪里有问题,没有实现的好。
  • 下面是我写的, 大概是写对的
#include <iostream>
#include <vector>
using namespace std;

struct  Node{
    int val;
    Node* left;
    Node* right;
    Node(int x):val(x),left(NULL),right(NULL){};
};

vector<int> res;

void dfs(Node* root){
    if (root->left) dfs(root->left);
    if (root->right) dfs(root->right);
    res.push_back(root->val);
}

int main(){
    Node* root =new Node(1);
    dfs(root);
    for(int i = 0;i < res.size();i ++)
        cout<<res[i]<<",";
    delete root;
}

针对第二个问题,表述如下

  • 要将二叉树的左右子节点更换为后序遍历中的左右子节点,并且更改之后的结果可能不是一个树,甚至有可能成为其他结构。

  • 其实我蛮不能理解他的用意的,究竟是让我干什么?把一个二叉树的左右子节点变为后续遍历顺序中的节点,那么指针的方向有没有改变?然后,构建出来是什么样?原来的结构还要保存吗?

  • 如果只是单纯换一个方式,不就是在创建一个后序遍历的链表吗?把每一个节点都加进去不就行了吗?

  • 现在还不是很懂这个题目

  • 下面是ChatGPT写的,感觉没有什么意义。

#include <iostream>
#include <vector>

struct Node {
    int val;
    Node* left;
    Node* right;
    Node(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 后序遍历,记录节点访问顺序
void postOrderDFS(Node* root, std::vector<Node*>& nodes) {
    if (root == nullptr) {
        return;
    }
    postOrderDFS(root->left, nodes);
    postOrderDFS(root->right, nodes);
    nodes.push_back(root);
}

// 根据后序遍历的节点顺序调整左右子节点
void adjustNodes(std::vector<Node*>& nodes) {
    for (size_t i = 0; i < nodes.size() - 1; ++i) {
        nodes[i]->left = nullptr;
        nodes[i]->right = nodes[i + 1];
    }
    nodes.back()->left = nullptr;
    nodes.back()->right = nullptr;
}

// 辅助函数:中序遍历打印二叉树
void inOrderPrint(Node* root) {
    if (root == nullptr) {
        return;
    }
    inOrderPrint(root->left);
    std::cout << root->val << " ";
    inOrderPrint(root->right);
}

// 辅助函数:后序遍历打印二叉树
void postOrderPrint(Node* root) {
    if (root == nullptr) {
        return;
    }
    postOrderPrint(root->left);
    postOrderPrint(root->right);
    std::cout << root->val << " ";
}

int main() {
    // 创建一个简单的二叉树
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    root->right->left = new Node(6);
    root->right->right = new Node(7);

    std::cout << "Original tree (in-order): ";
    inOrderPrint(root); // 预期输出: 4 2 5 1 6 3 7
    std::cout << std::endl;

    std::cout << "Original tree (post-order): ";
    postOrderPrint(root); // 预期输出: 4 5 2 6 7 3 1
    std::cout << std::endl;

    // 后序遍历并记录节点顺序
    std::vector<Node*> postOrderNodes;
    postOrderDFS(root, postOrderNodes);

    // 根据后序遍历顺序调整节点
    adjustNodes(postOrderNodes);

    std::cout << "Adjusted structure (in-order): ";
    inOrderPrint(root); // 可能无法正确打印,因为树结构已改变
    std::cout << std::endl;

    std::cout << "Adjusted structure (post-order): ";
    postOrderPrint(root); // 预期输出与原后序遍历顺序一致
    std::cout << std::endl;

    return 0;
}

总结

  • 面试很难受,不过我尽力了,算法也复习到了。不过反映出我的问题,就是很多东西看的不够细致,不够深入,先过一遍,后续再继续深化。时间不是很够,加油。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改yarn、npm、pnpm为国内镜像源

国内由于网络的原因&#xff0c;使用官方的npm、yarn、pnpm访问下载依赖库会很慢&#xff0c;有时候还会出现无法访问的情况&#xff0c;这时候就需要我们给npm、yarn、pnpm换一个国内的镜像源的&#xff0c;一般的我们可以将镜像换成淘宝的源&#xff0c;由于平时比较常用到的…

Vue65-组件之间的传值

1、收数据 2、传数据 3、批量的数据替换 若是info里面有四个数据&#xff0c;传过来的dataObj里面有三个数据&#xff0c;则info里面也只有三个数据了 解决方式&#xff1a; 该写法还有一个优势&#xff1a;传参的时候&#xff0c;顺序可以随意&#xff01;

谈论实时摄像头的稳定性,防抖算法

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

C语言的基本输入输出函数+构造类型数据——数组

C语言的基本输入输出函数 1. 字符输入输出函数 getchar()、putchar() getchar()&#xff1a;从标准输入&#xff08;通常是键盘&#xff09;读取一个字符&#xff0c;并返回其ASCII值。putchar()&#xff1a;将指定的字符&#xff08;由其ASCII值表示&#xff09;写入标准输出…

模版与策略模式

一&#xff0c;怎么选择 如果需要固定的执行流程&#xff0c;选模版 如果不需要固定的执行流程&#xff0c;只需要对一个方法做具体抽象&#xff0c;选策略 参考文章&#xff1a; 常用设计模式汇总&#xff0c;告诉你如何学习设计模式 二&#xff0c;常用写法 子类 exten…

龙讯旷腾PWmat计算vdW异质结中热载流子冷却 | 复刻《Phys. Chem. Chem. Phys 》文献

01 NAMD 背景介绍 在各类光物理与光化学过程当中&#xff0c;均会牵涉到激发态载流子动力学过程&#xff0c;诸如电荷弛豫、复合以及输运等等。光激发或者电子注入将初始的平衡状态打破&#xff0c;所产生的热载流子在其演化进程中&#xff0c;会与原子核产生强烈耦合。此时&a…

关于车规级功率器件热可靠性测试的分享

随着中国电动汽车市场的稳步快速发展和各大车企布局新能源的扩散&#xff0c;推动了车规级功率器件的快速增长。新能源汽车行业和消费电子都会用到半导体芯片&#xff0c;但车规级芯片对外部环境要求很高&#xff0c;涉及到的一致性和可靠性均要大于工业级产品要求&#xff0c;…

利用Systemverilog+UVM搭建SOC及ASIC的RTL验证环境

在集成电路设计的复杂世界中&#xff0c;验证环节是确保设计满足预期功能和性能要求的关键步骤。随着系统级芯片&#xff08;SOC&#xff09;和特定应用集成电路&#xff08;ASIC&#xff09;的规模和复杂性不断增加&#xff0c;传统的验证方法已经难以满足高效、准确的验证需求…

基于顺序表的排序

任务内容 基于一个顺序表&#xff0c;实现如下排序算法&#xff1a; 直接插入排序&#xff1b;交换排序 &#xff08;冒泡&#xff09;&#xff1b;简单选择排序 代码实现 #include<iostream> #include<string> using namespace std; #define keytype int type…

Javaweb登录校验

登录校验 JWT令牌的相关操作需要添加相关依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>一、摘要 场景&#xff1a;当我们想要访问一个网站时&am…

真空玻璃可见光透射比检测 玻璃制品检测 玻璃器皿检测

建筑玻璃检测 防火玻璃、钢化玻璃、夹层玻璃、均质钢化玻璃、平板玻璃、中空玻璃、真空玻璃、镀膜玻璃夹丝玻璃、光栅玻璃、压花玻璃、建筑用U形玻璃、镶嵌玻璃、玻璃幕墙等 工业玻璃检测 钢化安全玻璃、电加温玻璃、玻璃、半钢化玻璃、视镜玻璃、汽车安全玻璃、汽车后窗电热…

Docker+MySQL:打造安全高效的远程数据库访问

在现代应用开发和部署中&#xff0c;数据库是关键组件之一。无论是开发环境还是生产环境&#xff0c;快速、可靠地部署和管理数据库都是开发人员和运维人员面临的常见挑战之一。 Docker是一种流行的容器化技术&#xff0c;它使得应用程序的部署和管理变得非常简单和高效。通过使…

大数据-数据分析初步学习,待补充

参考视频&#xff1a;数据分析只需3小时从入门到进阶&#xff08;up亲身实践&#xff09;_哔哩哔哩_bilibili 数据指标&#xff1a; 对当前业务有参考价值的统计数据 分类&#xff1a;用户数据&#xff0c;业务数据&#xff0c;行为数据 用户数据 存量&#xff1a; DAU&#…

CSS3中鲜为人知但非常强大的 Clip-Path 属性

CSS3中鲜为人知但非常强大的 Clip-Path 属性 在CSS3中,clip-path属性可以让我们快速创建各种各样的不规则图形,而无需使用图片或者复杂的绘图工具。它可以帮助我们实现一些非常出色的视觉效果,但遗憾的是它并不是很常见。 clip-path属性可以接受多种不同的值,比如polygon()、…

Matlab终于能够实现Transformer预测了

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 完整代码 今天…

Day9—Spark运行模式及RDD的创建

Spark概述 大数据开发的总体架构 可以看到&#xff0c;在数据计算层&#xff0c;作为Hadoop核心组成的MapReduce可以结合Hive通过类SQL的方式进行数据的离线计算&#xff08;当然也可以编写独立的MapReduce应用程序进行计算&#xff09;&#xff1b;而Spark既可以做离线计算&a…

金属配件加工厂设备远程监控

随着科技的飞速发展&#xff0c;智能制造已成为制造业转型升级的重要方向。在金属配件加工领域&#xff0c;设备的稳定运行和高效管理对于提升产品质量、降低生产成本至关重要。HiWoo Cloud平台凭借其强大的远程监控功能&#xff0c;为金属配件加工厂提供了全新的解决方案&…

RabbitMQ详解-06RabbitMQ高级

1. 过期时间TTL 可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过了之后消息自动被删除。RabbitMQ可以对消息和队列设置TTL。有以下两种设置方法&#xff1a; 通过队列属性设置&#xff0c;队列中所有消息都有相同的过期时间。对消息进…

省市区下拉选择:3个el-select(附完整代码+json)

目录 直接上做出的效果&#xff1a; 页面代码&#xff1a; 使用click.native&#xff1a; data及引入&#xff1a; 初始化&#xff1a; methods&#xff1a; JSON: 示例结构&#xff1a; 1.code.json 2.pca-code.json 回显&#xff1a; 视频效果&#xff1a; 直接上做出…

5个好用的中文AI大语言模型_中文大语言模型

AI大语言模型&#xff08;Large Language Models, LLMs&#xff09;是近1-2年来人工智能领域的重要发展&#xff0c;它们通过深度学习技术&#xff0c;特别是基于Transformer的架构&#xff08;如GPT、BERT等&#xff09;&#xff0c;实现了对自然语言处理的巨大突破。 AI大语…