当前位置: 首页 > news >正文

秋招突击——6/11——复习{(树形DP)树的最长路径、电话号码的字母组合}——新作{重复序列中前最小的数字}

文章目录

    • 引言
    • 复习
      • 树形DP——树的最长路径
      • 电话号码的字母组合
    • 新作
      • 重复序列中前最小的数字
        • 个人实现
        • 参考实现
    • 总结

引言

  • 这两天可能有点波动,但是算法题还是尽量保证复习和新作一块弄,数量上可能有所差别。

复习

树形DP——树的最长路径

  • 这道题是没有完全听完,但是到现在这个阶段,最起码得数组实现邻接链表做完,具体效果如下
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>using namespace std;const int N = 1000;
int h[N],ne[2* N],e[2*N],w[2*N],idx;void add(int a,int b,int c){e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;
}int main(){memset(h,-1,sizeof(h));for (int i = h[1]; ~i; i = ne[i]) {cout<<1<<"   "<<e[i]<<endl;}}

电话号码的字母组合

  • 这里需要学到两点,一个是使用字符串数组进行映射,还有就是使用“-‘0’”将char变成数字。
  • 使用回溯实现,效果会更好。
  • 这里没啥问题,基本上是一遍过。
class Solution {
public:vector<string> temp = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};vector<string> res;void dfs(string digits,int u,string path){// 终止条件if (u == digits.size()) res.push_back(path);else{// 遍历当前的字符进行拼接for (auto i : temp[digits[u] - '0']) {dfs(digits,u + 1,path + i);}}}vector<string> letterCombinations(string digits){if (digits.size() == 0) return res;dfs(digits,0,"");return res;}
};

新作

重复序列中前最小的数字

  • 这个是收钱吧的笔试题目,这道题目是挺简单的,具体的题目描述信息如下

  • 给定一个长度为n的重复数组(里面会有重复值),找出其中不去重的最小的k个数,比如【4,5,1,6,7,3,8,2,7,8】,输出【1,2,3,4】。

  • 对于时间复杂度和空间复杂度有要求,分别是O(n),O(nlogk)

个人实现
  • 我这里是使用的二分查找修改实现的,先对前k个元素加入到列表中,进行排序,然后后续没加入一个新的元素,都在新加入的元素进行基于二分查找的排序,那就是在有序的元素里面进行二分查找的排序,是logk,然后每一个元素就是nlogk
  • 这里仅仅通过了80%的样例,并不知道为什么?看一下GPT怎么分析的。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void midSort(vector<int> &temp ,int l,int r,int v){// 进行具体的排序if(v >= temp[l] && v <= temp[r] && (l == r || l + 1 == r)){// 向后移动元素if(v == temp[l])  r = l;for(int i = temp.size() - 1;i > r ;i --){temp[i] = temp[i - 1];}temp[r] = v;}else{int mid = (l + r) / 2;if(temp[mid] < v){midSort(temp,mid,r,v);}else{midSort(temp,l,mid,v);}}
}vector<int> Solution(vector<int> &input,int k){// 进行具体的排序vector<int> res;if( k >= input.size())   return input;if(k == 0)  return res;// 遍历并将前几个元素放入到res中for(int i =0 ;i < k;i ++){res.push_back(input[i]);}sort(res.begin(),res.end());// 然后逐个加入元素进行排序for (int i = k; i < input.size(); ++i) {if(input[i] < res[k - 1])   midSort(res,0,k - 1,input[i]);}return res;
}int main(){}
  • 这里参考了一下,我自己有一些问题,确实写的不对,有以下几个地方。
  • 从原来的vector中声明一个新的vector数组,使用迭代器效果会更好
  • 我的方法使用的最坏时间复杂度是移动了O(k),平均时间复杂度是O(logk)
// 结果数组std::vector<int> res(input.begin(), input.begin() + k);std::sort(res.begin(), res.end());
  • 具体代码修改如下
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void midSort(vector<int> &temp ,int l,int r,int v){// 进行具体的排序if(l == r || l + 1 == r){// 向后移动元素if(v <= temp[l])  r = l;for(int i = temp.size() - 1;i > r ;i --){temp[i] = temp[i - 1];}temp[r] = v;}else{int mid = (l + r) / 2;if(temp[mid] < v){midSort(temp,mid,r,v);}else{midSort(temp,l,mid,v);}}
}vector<int> Solution(vector<int> &input,int k){// 进行具体的排序vector<int> res(input.begin(),input.begin()+ k);if( k >= input.size())   return input;if(k == 0)  return res;// 遍历并将前几个元素放入到res中sort(res.begin(),res.end());// 然后逐个加入元素进行排序for (int i = k; i < input.size(); ++i) {if(input[i] < res[k - 1])   midSort(res,0,k - 1,input[i]);}}int main(){}
参考实现
  • 这里是推荐使用堆排序,插入和删除操作的时间复杂度为 𝑂(log⁡𝑘),总共进行n次操作,总时间复杂度就是O(nlogk)。这里是使用优先队列实现最大堆。将堆顶的元素弹出,然后在重新进行排序。
  • 其实我觉得这里使用优先队列进行排序,就不是使用对排序了,时间复杂度是取决于你使用的排序算法了。
    • 好吧,是我孤陋寡闻了,搜了一下,优先队列是使用堆排序实现的
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>std::vector<int> findKSmallest(const std::vector<int>& nums, int k) {// 使用优先队列实现最大堆std::priority_queue<int> maxHeap;for (int num : nums) {if (maxHeap.size() < k) {maxHeap.push(num);} else if (num < maxHeap.top()) {maxHeap.pop();maxHeap.push(num);}}// 将结果从优先队列中取出std::vector<int> result;while (!maxHeap.empty()) {result.push_back(maxHeap.top());maxHeap.pop();}// 返回结果return result;
}int main() {std::vector<int> nums = {4, 5, 1, 6, 7, 3, 8, 2, 7, 8};int k = 4;std::vector<int> result = findKSmallest(nums, k);std::sort(result.begin(), result.end()); // 使结果有序以便阅读std::cout << "The smallest " << k << " elements are: ";for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

这里再回顾一下堆排序的做法
之前还写过呀,但是一点印象都没有。

大概还是看的比较费劲,为了省时间,这里跳过了。

总结

  • 这两天欠的比较多,在上海陪女朋友过端午,打扫卫生等扽,还有就是面试完了想放松一下,所以做的并不多,后续加油,继续做,跟上这个进度。
  • 明天得把树的最长路径做完了,然后继续复习一下,之前的DP算法,同时leetcode继续做。

相关文章:

秋招突击——6/11——复习{(树形DP)树的最长路径、电话号码的字母组合}——新作{重复序列中前最小的数字}

文章目录 引言复习树形DP——树的最长路径电话号码的字母组合 新作重复序列中前最小的数字个人实现参考实现 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路径 这道题是没有…...

Lua与C交互API接口总结

Lua与C交互 1. 常见Lua相关的C API压入元素查询元素获取元素检查元素栈的相关数据操作 2. C调用Lua核心调用函数示例 3. Lua调用C1. C函数注册到Lua&#xff08;lua_register&#xff09;示例2. 批量注册&#xff08;luaL_Reg&#xff09;示例 1. 常见Lua相关的C API 压入元素…...

DT浏览器很好用

简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;操作起来非常流畅&#x1f60e;&#xff0c;几乎不会有卡顿的情况。 搜索功能也十分强大&#x1f44d;&#xff0c;能够快速精准地找到想要的信息。 而且还有出色的兼容性&#xff0c;各种网页都…...

RabbitMQ实践——在管理后台测试消息收发功能

在《RabbitMQ实践——在Ubuntu上安装并启用管理后台》中&#xff0c;我们搭建完RabbitMQ服务以及管理后台。本文我们将管理后台&#xff0c;进行一次简单的消息收发实验。 赋予admin账户权限 登录到管理后台&#xff0c;进入到用户admin的管理页面 点击“set permission”&a…...

vscode卡顿问题处理(vue-official插件)

vue官方扩展由volar升级为vue-official&#xff0c;部分人的ide会变得非常卡顿&#xff0c;这是由于vscode本身一些问题导致&#xff0c;如下图作者解释&#xff1a; 解决方式&#xff1a; 通过禁用Hybrid模式&#xff0c;不使用tsserver来接管语言支持&#xff0c;卡顿会缓解…...

使用Kube-Bench对Kubernetes进行安全检测

使用Kube-Bench对Kubernetes进行安全检测 1. 工具介绍 Kube-Bench是一个开源的Go语言工具&#xff0c;用于自动化检查Kubernetes集群是否符合CIS Kubernetes基准。这些基准包括一系列关于Kubernetes配置和部署安全性的建议和最佳实践。 Kube-Bench执行了一系列针对Kubernete…...

STM32开发过程中碰到的问题总结 - 1

文章目录 前言1. 怎么生成keil下可以使用的文件和gcc下编译使用的makefile2. STM32的时钟树3.怎么查看keil5下的编译工具链用的是哪个4. Arm编译工具链和GCC编译工具链有什么区别吗&#xff1f;5. 怎么查看Linux虚拟机是x86的还是aarch646. 怎么下载gcc-arm的编译工具链7.怎么修…...

hiberfil.sys文件在Windows系统作用

hiberfil.sys文件在Windows系统中起着关键的作用&#xff0c;主要涉及到计算机的休眠功能。以下是关于hiberfil.sys的详细解释&#xff1a; 定义与功能&#xff1a; hiberfil.sys是Windows休眠功能&#xff08;Windows Hibernation&#xff09;将内存数据与会话保存至硬盘所需…...

智能制造前沿:ARMxy工控机在机器人控制中

机器人控制系统正逐步成为现代制造业的核心引擎。在这个过程中&#xff0c;ARMxy工业计算机以其独特的优势&#xff0c;成为了驱动这一变革的关键力量。本文将以自动化装配线机器人为例&#xff0c;探讨ARMxy如何通过其低功耗、高性能特性&#xff0c;以及高度灵活性的设计&…...

【CS.AI】AI引领编程新时代:深度探索GitHub Copilot

文章目录 引言0. TOP TAKEAWAYS 重要要点1. Copilot的基本功能2. 技术原理3. 优势与局限优势局限 4. 使用体验4.1 初次使用4.2 在 JetBrains 全家桶中使用 GitHub Copilot1. 安装插件2. 配置插件3. 使用 GitHub Copilot 4.3 日常开发4.4 体验与反馈 5. 对开发者生态系统的影响5…...

Java:爬虫htmlunit抓取a标签

如果对htmlunit还不了解的话可以参考Java&#xff1a;爬虫htmlunit-CSDN博客 了解了htmlunit之后&#xff0c;我们再来学习如何在页面中抓取我们想要的数据&#xff0c;我们在学习初期可以找一些结构比较清晰的网站来做测试爬取&#xff0c;首先我们随意找个网站如下&#xff…...

电池包断路单元DBU的预充电电阻应用案例

当电池组接触器闭合到电机和逆变器上时&#xff0c;逆变器电容器中会有电流涌入。这种非常高的电流至少可能会使接触器老化&#xff0c;并可能永久损坏接触器。 因此&#xff0c;当我们关闭电池组上的接触器时&#xff0c;我们分三个步骤执行此操作&#xff1a; 1.关闭主负极…...

车载网络安全指南 系统层面开发阶段(六)

返回总目录->返回总目录<- 目录 前言 一、统层面产品开发启动 二、系统层面漏洞分析 三、网络安全策略具体化 四、确定网络安全技术需求 五、系统设计 六、系统集成与测试 七、网络安全验证 八、系统层面网络安全评估 九、系统层面产品开发阶段检查 十、产品发…...

Julia 文件读写

Julia 文件读写 Julia 是一种高性能的动态编程语言,特别适合于数值计算和科学计算。在数据处理和科学研究中,文件读写是一项基本且重要的技能。Julia 提供了一套丰富的函数和库来处理文件读写操作,使得文件操作变得简单而高效。 基本文件操作 打开和关闭文件 在 Julia 中…...

为何总是会失败

总是失败可能涉及多种因素&#xff0c;但这里有一些常见原因和对应的建议&#xff0c;或许可以帮助你找到问题所在并加以改进。 1. 目标不明确 原因 目标不清晰或设定过高会导致失望和挫折感。如果目标不明确&#xff0c;行动就会缺乏方向&#xff0c;导致效率低下和失败。 …...

【PB案例学习笔记】-21小大写金额转换

写在前面 这是PB案例学习笔记系列文章的第21篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…...

12.实战私有数据微调ChatGLM3

实战私有数据微调ChatGLM3 实战私有数据微调ChatGLM3实战构造私有的微调数据集基于 ChatGPT 设计生成训练数据的 Prompt使用 LangChain GPT-3.5-Turbo 生成训练数据样例训练数据解析、数据增强和持久化存储自动化批量生成训练数据集流水线提示工程&#xff08;Prompt Engineer…...

PHP地方门户分类信息网站源码讯客分类信息系统源码(含手机版)

源码介绍 1.上传程序到网站根目录,访问http://域名/install/index.php 进行安装,不要直接打开网址&#xff0c;先直接安装; 2.安装完成后 后台恢复数据即可 默认帐号密码都是admin http://域名/admin/ 3.不要删除任何文件&#xff0c;因为删除文件或者修改代码可能造成错误 运…...

设计模式 —— 观察者模式

设计模式 —— 观察者模式 什么是观察者模式观察者模式定义观察者模式的角色观察者模式的使用场景观察者模式的实现 被观察者&#xff08;Subject&#xff09;观察者&#xff08;Observer&#xff09;通知&#xff08;notify&#xff09;更新显示&#xff08;update&#xff09…...

光纤跳线(又称光纤连接器)的种类

光纤跳线&#xff08;又称光纤连接器&#xff09;&#xff0c;也就是接入光模块的光纤接头&#xff0c;也有好多种&#xff0c;且相互之间不可以互用。SFP模块接LC光纤连接器&#xff0c;而GBIC接的是SC光纤连接器。下面对网络工程中几种常用的光纤连接器进行详细的说明&#x…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...