秋招突击——6/15——复习{(树形DP)树的最长路径,(单调队列优化DP)——最大子序和,无重复最长子串}——新作{四数之和}

文章目录

    • 引言
    • 复习
      • 树形DP——树的最长路径
        • 实现代码
        • 答疑
      • 单调队列优化DP——最大子序和
        • 个人实现思路
        • 参考思路分析
        • 实现代码
      • 无重复最长字串
        • 思路分析
        • 实现代码
    • 新作
      • 四数之和
        • 实现思路
          • 需要注意的问题
        • 参考代码
          • 分析思路
          • 实现代码
    • 总结

引言

  • 今天好好看看树的最长的路径,自己重新写一下,之前看过了 ,这个思路并不难的,然后在学一下单调队列优化DP,这个得看准时间,不能一次学过了,能学多少学多少。

复习

树形DP——树的最长路径

  • 以往的学习链接

  • 第一次分析

  • 第二次分析

  • 第三次分析

  • 这道题总得来事主要分为两个部分,分别是

    • 使用一维数组表示邻接链表,然后的进行逐个遍历
    • 在遍历邻接链表的过程中,分别使用动态规划,计算最大值和次大值
  • 已经分析过很多次了,这里直接给出实现过程

实现代码
#include <iostream>
#include <cstring>
using namespace std;

const int N = 10010;
int h[N],e[2*N],ne[2*N],w[2*N],idx;
int f1[N],f2[N],res = 0;
void add(int a,int b,int c){
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx ++;
}

void dfs(int r,int father){
    // 这里需要对参数进行说明
    // r表示以当前节点为跟节点的子树
    // father表示节点r的父节点

    // 如果传入的节点是father,跳过
    if (r == father )   return ;

    // 遍历当前跟节点的所有的子节点
    f1[r] = f2[r] = 0;
    for (int i = h[r]; ~i ; i = ne[i]) {
        int j = e[i];
        // 进行递归,遍历更新对应的子节点
        dfs(j,r);
        // 情况一,大于最大的边
        if(w[i] + f1[j] > f1[r]) f1[r] = w[i] + f1[j],f2[r] = f1[r];
        // 情况二,不大于最大的边,大于次大的边
        if(w[i] + f1[j] > f2[r]) f2[r] = w[i] + f1[j];
    }
    res = max(res , f1[r] + f2[r]);
}

int main(){
    int n;
    cin>>n;
    memset(h,-1,sizeof(h));
    for (int i = 0; i < n - 1; ++i) {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    // 这里是有一个问题,本质上是一个无向树,是否需要遍历每一个根节点作为子节点
    // 个人猜测是需要,因为认为规定了父子节点的逆序关系
    // 但是这里的代码有没有保存,根本没有办法进行遍历
    dfs(1,-1);
    cout<<res;
    return 0;
}
答疑
  • 这里有两个地方搞不清楚

是否需要遍历所有的定点都当做树的根节点

  • 不需要,因为每一次计算的时候,都是计算了最长边和最短边,最终的路径是最长边和最短边同时相加,所以是一个双向的路径,所以不需要。
  • 任选一个节点作为根节点,然后指定父节点,这个树的唯一拓扑结构就确定了,不会存在出现歧义的情况。
  • 所以不需要遍历每一个节点作为根节点

判定是否为父节点的情况

  • 因为是无向边,所以在遍历所有邻接链表的过程中,会遍历到父节点,所以这里需要跳过,所以实在遍历子节点过程中,判定是否为父节点,我原来的代码写错了。

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

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

  • 题目内容如下,这是一个单调队列优化DP,先给我五分钟,看一下,写一下思路。
    在这里插入图片描述
个人实现思路
  • 找一个连续子序列,使其和最大。一个子序列明显是包含了左端点和右端点,这里的直接暴力搜索,因该可以的。最终的时间复杂度是n的平方,但是这里有30万个节点,最终的结果肯定超过了运行的时间,不行。
  • 如何优化暴力搜索?
    • 会不会存在子串的情况,因为每一次都是完全从左到右的扫描的话,会存在重复使用子区间的情况,所以还是得想想看怎么弄,怎么优化?
    • 是不是状态DP,不是的,这是一个连续的数字,如果不是连续的数字,就可能是状态DP
    • 状态压缩DP,也不像,这里仅仅是有两个状态

真的服了,我这是完全没有看题,看成了任意长度,绝了,这是长度不超过m的连续子序列问题
看清题目!!!!!!!!!!

参考思路分析
  • 这里暂时理清了一部分思路,但是还是没有完全看懂,这个单调队列怎么推出来的,怎么写出来的。

  • 首先说一下问题转换

    • 将一个序列的最优值变成了的不同终点的序列中,计算最大值,再转成计算Sj的最小值
      在这里插入图片描述
  • 这里是有问题的,这里是计算{K-m,K-j}的最小值,是这个区间的最小值,怎么就变成了求他的最小值,编程了再{K-m,K}的序列中,计算以K-m为起点的,长度小于等于m的最小的连续序列====》计算最小值?怎么转换的?

  • 正常不应该是找出从{i-m}到j的不同的序列,找出其中的最小值吗?
    在这里插入图片描述

  • 上述前提有一个朴素的证明,那就是如果你下一个要增加的数字是不断递增的,那么你的结果就一定是越大的,但是如果你下一个数字不是单调递增的,那么你累加和得结果就有可能不是最大的,会变小,所以要比较。

在这里插入图片描述

实现代码
  • 这里直接贴代码,没看懂他的思路
  • 得,还是没有看懂,直接自己debug吧,自己理解吧。
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 3e5 + 10;

int n, m;
LL s[N], que[N];

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%lld", &s[i]), s[i] += s[i - 1];

    LL res = -1e18;
    int hh = 0, tt = 0; que[0] = 0;
    for (int i = 1; i <= n; i ++ )
    {
        while (hh <= tt && i - que[hh] > m) hh ++ ;
        res = max(res, s[i] - s[que[hh]]);
        while (hh <= tt && s[que[tt]] >= s[i]) tt -- ;
        que[ ++ tt] = i;
    }
    printf("%lld\n", res);
    return 0;
}

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

无重复最长字串

  • 这道题是中等题,我记得我在华为面试手撕代码的时候做了,但是没有做出来,只通过了部分样例,那个时候是第三次做,没做好。

  • 关键是这道题第一次做,我做过了,第二遍是跟着解析做的,第三次没做出来,但是后续又刷了一遍,这是第四遍,看看哈。

  • 前几次的链接

    • 华为面试的结果
    • 第二次做
  • 好吧,看错了,原来拿到没做出来的题目是三数之和,这道题也是第二次做,看看哈。二十分钟,做出来。

思路分析
  • 这道题是双指针,使用hashmap维系左右指针所包含的所有的字符串的出现次数,具体实现代码如下
    在这里插入图片描述
实现代码
#include <iostream>
#include <unordered_map>
using namespace std;

int lengthOfLongestSubstring(string s){
    unordered_map<char,int > t;
    int len = s.size(),res = 0;
    int l = 0,r = 0;
    while(r < len){
        // 将右指针当前的字符的hash表加1
        t[s[r]]++;
        // 判定一下,当前的字母的是否出现过多次,如果出现过多次
        while (t[s[r]] > 1) {
            t[s[l]] --;
            l ++;
        }
        r ++;
        res = max(res,r - l);
    }
    return res;
}
int main(){

}

新作

四数之和

实现思路
  • n个整数组成的数组:是否是有序的,是否是重复的
  • 要求
    • 不重复的四元组
    • 累加和为target
  • 这个可以联想到三数之和问题,三数之和问题是拆解成两数之和解决的。
  • 需要将二维数组进行排序。
  • 如果将之转成三数之和,再转成两数之和,时间复杂度就是n的三次方,百万级别,应该能够接受,实现一下
  • 写是写完了,但是又遇到了重复的问题,除了使用set,并不知道如何进行去重了,我得趁着有时间,做一下尝试。
  • 在不使用set的情况下,只能写成这样了,不过肯定还有问题的,这里还是使用set实现一下。

在这里插入图片描述

  • 使用set实现了,效果如下
    在这里插入图片描述
    实现代码如下
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums,int target ){
    vector<vector<int>> res;
    sort(nums.begin(),nums.end());
    set<vector<int>> temp;
    int s = nums.size();
    if(s < 4)   return res;
    for (int i = 0; i < s; ++i) {
        for (int j = i + 1; j < s; ++j) {
            for (int l = j + 1; l < s; ++l) {
                int r = s - 1;
                while (r - 1 > l &&  long(nums[r - 1]) + long(nums[i]) + long(nums[j]) + long(nums[l]) >= target) r--;
                if (r > l && long(nums[r]) + long(nums[i]) + long(nums[j]) + long(nums[l]) == target){
                    temp.insert({ nums[i], nums[j], nums[l],nums[r]});
                }
            }
        }
    }
    for (auto x: temp) {
        res.push_back(x);
    }
    return res;
}

};
需要注意的问题
  • 如何更加有效的去重并不知道
  • 如何处理大数相加越界的问题,目前没有好办法。
参考代码
分析思路
  • 基本思路和我的相同
    如何去重
  • 这里是和前一个指针进行比较,如果和前一个状态一样,说明后续遍历的结果也是相同的
  • 这里很有细节,如果是第一个定位的元素,就要注明是大于0
  • 后续所有元素,都要确保第一个元素已经访问过了,然后在进行遍历访问。

在这里插入图片描述

  • 和之前的元素进行比较!!!!

处理越界问题

  • 这里直接使用特定情况进行处理,就几个样例。
实现代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

vector<vector<int>> fourSum(vector<int>& nums,int target ){
    vector<vector<int>> res;
    sort(nums.begin(),nums.end());
    int s = nums.size();
    for (int i = 0; i < s; ++i) {
        if (i && nums[i - 1] == nums[i]) continue;
        for (int j = i + 1; j < s; ++j) {
            // 确保第一个元素已经访问过,然后在和前一个状态进行比较
            if (j > i + 1 && nums[j - 1] == nums[j]) continue;
            for (int l = j + 1; l < s; ++l) {
                if(l > j + 1 && nums[j] == nums[j - 1]) continue;
                int r = s - 1;
                while (r - 1 > l && nums[r - 1] + nums[i] + nums[j] + nums[l] >= target) r--;
                if (nums[r] + nums[i] + nums[j] + nums[l] == target){
                    res.push_back({nums[r], nums[i], nums[j], nums[l]});
                }
            }
        }
    }
    return res;
}

int main(){

}

总结

  • 今天关于单调队列有超时了,不应该,这个学习算法的时间不应该太多,不过就是有点烦,居然又没有看懂。
  • 不能再看了,超过了半个多少小时,一上午都在看这个了,不能浪费时间了。
  • 有点挫败,还是没有看懂,跳过吧,明天再来看,控制一个小时,学完java才是关键,算法不是关键。

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

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

相关文章

JavaWeb之初识Tomcat

Tomcat 轻量级应用服务器、JSP、Servlet Tomcat目录结构 在IDEA中创建web项目 在这里不使用maven构建项目&#xff0c;这种方式后面会更新 新建一个java项目File -> Project Settings -> Facets -> -> Web -> OK ( 此时src目录下有一个web目录 )Edit ->…

39、基于深度学习的(拼音)字符识别(matlab)

1、原理及流程 深度学习中常用的字符识别方法包括卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;。 数据准备&#xff1a;首先需要准备包含字符的数据集&#xff0c;通常是手写字符、印刷字符或者印刷字体数据集。 数据预处理&#xff1…

ElasticSearch + kibana:类型声明

当我们使用 kibana 创建索引时&#xff0c;如果不申明数据类型&#xff0c;默认字符串赋予 text类型&#xff0c;如下图所示 接下来我们继续创建多条数据如下&#xff1a; 下面我们来检索下&#xff1a; 通过以上两个案例我们发现&#xff0c;使用 match 模糊查询 li-3 明明…

智利企鹅濒临灭绝,回顾曾仕强的2025年预言!实干才是硬道理——早读(逆天打工人爬取热门微信文章解读)

你相信我们5000年凝结的精华易经吗&#xff1f; 引言Python 代码第一篇 洞见 有人晒出高考后家长支出清单&#xff0c;我觉得是时候告诉孩子挣钱的真相了第二篇 视频新闻结尾 引言 昨天有点破了 看小视频不小心看过头了 大概看了有2个小时 才醒悟过来 再接再厉呀&#xff01; …

vue3中如何使用pinia -- pinia使用教程(一)

vue3中如何使用pinia -- pinia使用教程&#xff08;一&#xff09; 安装使用创建 store使用 store访问修改 store 使用组合式 api 创建 store -- setup storepinia 和 hook 的完美结合如何解决上面的问题 使用 hook 管理全局状态和 pinia 有何优缺点&#xff1f;参考小结 pinia…

哈喽GPT-4o——对GPT-4o 文本创作的思考与看法

目录 用法1&#xff1a;创作小说用法2&#xff1a;创作散文用法3&#xff1a;创作诗歌1、古诗2、现代诗 用法4&#xff1a;创作儿童故事用法5&#xff1a;创作剧本 大家好&#xff0c;我是哪吒。 都说ChatGPT4o是目前文本创作的最强大模型&#xff0c;它都可以用于哪些方面的文…

ArcGIS 10.2软件安装包下载及安装教程!

今日资源&#xff1a;ArcGIS 适用系统&#xff1a;WINDOWS 软件介绍&#xff1a; ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成…

VirtualHere 允许通过网络远程使用 USB 设备,就像本地连接一样!

传统上&#xff0c;USB 设备需要直接插入计算机才能使用。有了 VirtualHere&#xff0c;就不再需要这样做&#xff0c;网络本身就变成了传输 USB 信号的电缆&#xff08;也称为 USB over IP、USB/IP、USB over WiFi、USB over Ethernet、USB 设备服务器&#xff09;。 此 USB …

Google谈出海:品牌「性价比」转向「心价比」

Google Marketing Live中国站活动现场 越来越多的中国全球化品牌基于对全球消费和海外地区的深刻洞察&#xff0c;不断提升产品研发和迭代能力&#xff0c;在海外消费者心中塑造「中国质造」和「中国智造」的新形象。2023年6月15日&#xff0c;凯度与Google合作发布《2023 凯…

JavaFX GridPane布局

网格布局 GridPane通常用于布局&#xff1a;表单布局 GridPane可以在行&#xff0c;列或单元格级别指定约束。 例如&#xff0c;我们可以设置包含输入文本字段的第二列&#xff0c;以在窗口调整大小时调整大小。 使用Java FX创建表格的时候&#xff0c;这个布局非常方便。 包…

开源低代码平台,JeecgBoot v3.7.0 里程碑版本发布

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

7大功能特色 让这款信创传输软件受众行业青睐

信创传输软件&#xff0c;顾名思义&#xff0c;也就是能够支持信创环境的文件传输系统&#xff0c;并且需要具备强大的功能&#xff0c;可以满足各种复杂的传输需求。 这种软件可能具有以下特点和功能&#xff1a; 1、兼容性&#xff1a;能够与信创环境中使用的硬件设备、网络…

智慧校园可视化大屏,对教学教务的提升是肉眼可见的

随着信息技术的快速发展&#xff0c;智慧校园已经成为许多学校追求的目标。智慧校园可视化项目是一种通过信息化手段对教学教务进行管理和提升的创新方式。 智慧利用先进的技术手段&#xff0c;将校园各个环节的数据信息进行收集、分析和展示&#xff0c;从而实现对教学教务工…

用Python分析《三国演义》中的人物关系网

用Python分析《三国演义》中的人物关系网 三国演义获取文本文本预处理分词与词频统计引入停用词后进行词频统计构建人物关系网完整代码 三国演义 《三国演义》是中国古代四大名著之一&#xff0c;它以东汉末年到晋朝统一之间的历史为背景&#xff0c;讲述了魏、蜀、吴三国之间…

项目方案:社会视频资源整合接入汇聚系统解决方案(六)

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分类…

[每周一更]-(第101期):打印机该如何选

文章目录 打印机分类1. 喷墨打印机 (Inkjet Printers)特点&#xff1a;优点&#xff1a;缺点&#xff1a; 2. 激光打印机 (Laser Printers)特点&#xff1a;优点&#xff1a;缺点&#xff1a; 3. 多功能一体机 (All-in-One Printers)特点&#xff1a;优点&#xff1a;缺点&…

15. 《C语言》——【如何动态内存开辟】

亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&#xff0c;成为一名优…

【2024最新精简版】SpringCloud面试篇

文章目录 SpringBoot和SpringCloud什么区别 ?你们项目为什么要使用微服务Spring Cloud 5大组件有哪些&#xff1f;&#x1f44d;什么是微服务?微服务的优缺点是什么?你们项目中微服务之间是如何通讯的? &#x1f44d;服务注册和发现是什么意思&#xff1f;Spring Cloud 如何…

第二证券A股重要变化!今起实施

A股系列重要指数迎来样本股调整&#xff01; 此前&#xff0c;深交所及其全资子公司深证信息发布公告&#xff0c;将对深证成指、创业板指、深证100&#xff08;以下统称“深市中心指数”&#xff09;施行样本股定时调整。此次调整于6月17日&#xff08;今日&#xff09;正式施…

数据分析中的数学:从基础到应用20240617

数据分析中的数学&#xff1a;从基础到应用 数据分析离不开数学的支持&#xff0c;统计学和概率论是其重要组成部分。本文将通过几个具体的实例&#xff0c;详细讲解数据分析中常用的数学知识&#xff0c;并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…