【C++ 算法进阶】算法提升七

目录

  • 正数数组中那两个数&结果最大 (贪心)
    • 题目
    • 题目分析
    • 代码详解
  • 最小相机覆盖问题 (二叉树递归套路)
    • 题目
    • 题目分析
    • 代码详解
  • 拼接字符串 (动态规划 + 前缀树)
    • 题目
    • 题目分析
    • 代码详解

正数数组中那两个数&结果最大 (贪心)

题目

给定一个由正整数组成的数组 现在要求你返回哪两个数组 & 的结果最大

题目分析

这道题和算法提升六中的异或有着明显的不同 因为在&运算中 只要有一个数是0 最后的结果就是0

也就是说 如果我们当前位是0 走0号线 1号线都是有理由的 但是我们无法比较0和1号线下面谁更好 所以说前缀树的方式是行不通的

但是 & 的特性告诉我们 尽量要前面位数的数字都为1

所以说我们就能有这样的思路

从最高位开始遍历整个数组 查看当前位置1的数量

  • 如果数量小于1 则说明当前位必定是0 没法求出最大值
  • 如果数量等于2 我们就可以直接将这两个数相与 得出最终答案
  • 如果数量大于3 则说明当前位必定是1 继续求下个为止的数据即可

代码详解

int Maxxx(vector<int>& arr) {// lnSize 数组的大小int ans = 0;int M = arr.size();// move 移动的位数for (int move = 30; move >= 0; move--) {// lnBit 当前比特位的数字int tmp = M;int lnBit = 0; int count = 0;int i = 0;while (i < M){lnBit = (arr[i] >> move) & 1;if (lnBit == 1) {int tmp = arr[i];arr[i] = arr[count];arr[count] = tmp;count++;}i++;}M = count;if (count < 2) {M = tmp;}if (count == 2) {return arr[0] & arr[1];}}return arr[0] & arr[1];
}

最小相机覆盖问题 (二叉树递归套路)

题目

给定一个二叉树 我们在树的节点上安装摄像头

节点上的每个摄影头都可以监视其父对象 自身及其子节点

计算监控树的所有节点所需的最小摄像头数量

题目分析

如果我们这里按照一般的二叉树套路分析 这里有这两种情况

  • 当前节有相机 且下方节点都被覆盖
  • 当前节点无相机 且下方节点都被覆盖

但是只是这两种可能性 我们不能得出最佳答案

在这里插入图片描述
我们假设当前节点为X 如果只根据情况1 2 我们得不出最佳的答案

最佳答案为在X的子节点放置一个相机

所以说我们要推出这三种可能性

  1. X有相机 且X下方都被覆盖了
  2. X无相机 且X下方都被覆盖了 且X也被覆盖了
  3. X无相机 且X下方都被覆盖了 且X没被覆盖

代码详解

#include <iostream>
#include <memory>class TreeNode {
public:int val;TreeNode* left;TreeNode* right;explicit TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
};enum class Status {Uncovered,CoveredNoCamera,CoveredHasCamera
};class Data {
public:Status status;int camera;Data(Status stat, int cam) : status(stat), camera(cam) {}
};// 独立的 process 函数
Data process(TreeNode* root) {if (!root) return Data(Status::CoveredHasCamera, 0);Data left = process(root->left);Data right = process(root->right);int camera = left.camera + right.camera;if (left.status == Status::CoveredNoCamera || right.status == Status::CoveredNoCamera) {return Data(Status::CoveredHasCamera, camera + 1);}if (left.status == Status::CoveredHasCamera || right.status == Status::CoveredHasCamera) {return Data(Status::CoveredHasCamera, camera);}return Data(Status::Uncovered, camera);
}class CameraCoverage {
public:static int resolveMinCamera(TreeNode* root) {Data data = process(root);return data.camera + (data.status == Status::Uncovered ? 1 : 0);}
};int main() {// 测试用例可以在这里添加return 0;
}

拼接字符串 (动态规划 + 前缀树)

题目

假设所有字符都是小写字母 字符串为str

arr是去重的单词表 每个单词都不是空字符且可以使用N次

使用arr中的字符有多少种可以拼接str的方法 (不存在无解的情况)

题目分析

这道题很明显是一个从左到右的动态规划模型

我们根据这个模型可以设置如下的递归函数

int process(string& s, int i) 

我们规定这个函数的意义是 返回从string的i位置开始 返回有多少种方法数可以让单词拼接成s

我们假设所有的单词都被我们放在了set里

代码详解

#include <unordered_set>
#include <vector>
#include <string>using namespace std;unordered_set<string> wordSet; // 假设已经填充好单词表
vector<int> dp;int process(const string& s, int i) {if (i == s.size()) {return 1;}if (dp[i] != -1) {return dp[i]; // 如果已经计算过,直接返回结果}int lnWays = 0;for (int index = i + 1; index <= s.size(); index++) {// 直接检查当前子字符串 s[i:index] 是否在 wordSet 中if (wordSet.count(s.substr(i, index - i))) {lnWays += process(s, index); // 递归调用下一个位置}}return dp[i] = lnWays; // 存储结果
}int countWays(const string& str) {dp.assign(str.size(), -1); // 初始化动态规划数组return process(str, 0);
}

我们这里就写出来了动态规划无优化的方法

但是这种方法的时间复杂度显然是过高的 因为每次拼接字符串的时候我们都需要遍历整个数组 导致了很多无用的遍历 (我们只需要遍历set中有的就行了)

那么这个时候我们就想起用前缀树了

class TireNode
{
public:unordered_map<char, TireNode*> children;bool isEnd = false;
};class Tire
{
public:TireNode* root;Tire() {root = new TireNode();}void insert(string& str) {TireNode* cur = root;for (auto ch : str) {if (!cur->children.count(ch)) {cur->children[ch] = new TireNode();}cur = cur->children[ch];}cur->isEnd = true;}};

这个时候我们只需要用一个map来记录下各个单词可能走的路径 并且继续下各个单词可能的节点 就能极大的优化查找字符串的效率

unordered_set<string> set;
int process(string& s, int i) {if (i == s.size()){return 1;}int ways = 0;TireNode* node = tire.root;for (int index = i; index < s.size(); index++){char ch = s[index];if (node ->children.count(ch)) {node = node->children[ch];if (node->isEnd == true) {ways += process(s, index + 1);}}else{break;}}return ways;
}

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

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

相关文章

SpringBoot实现 License 认证(只校验有效期)

文章目录 一、License介绍二、授权者生成密钥对三、授权者生成license.lic证书3.1、 配置pom.xml3.2 、License生成类3.3 、License生成类需要的参数类3.4、自定义KeyStoreParam3.5、main方法生成license.lic注意事项 四、使用者配置4.1、配置pom.xml4.2、License校验类4.3、Li…

室内地图制作-电子地图管理系统源代码公开-室内地图 开源-SDK调用指南(二)

一、室内外电子地图可视化制图项目需求 室内外地图开发需满足开发者可以在Android、iOs、web应用中加入地图相关的功能&#xff0c;包括&#xff1a;地图展示、地图交互、在地图上绘制路线、POI点、搜索、AR导航、蓝牙点位、离线地图等功能。 在开源室内地图编辑-电子地图管理…

Docker安装Mysql5.7,解决无法访问DockerHub问题

Docker安装Mysql5.7&#xff0c;解决无法访问DockerHub问题 简介 Docker Hub 无法访问&#xff0c;应用安装失败&#xff0c;镜像拉取超时的解决方案。 摘要 &#xff1a; 当 Docker Hub 无法访问时&#xff0c;可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…

第五届光学与图像处理国际学术会议(ICOIP 2025)征稿中版面有限!

第五届光学与图像处理国际学术会议&#xff08;ICOIP 2025&#xff09; 2025 5th International Conference on Optics and Image Processing (ICOIP 2025&#xff09; 重要信息 时间地点&#xff1a;2025年4月25-27日丨中国西安 截稿日期&#xff1a;2024年12月16日23:59 …

k8s和ipvs、lvs、ipvsadm,iptables,底层梳理,具体是如何实现的

计算节点的功能&#xff1a; 提供容器运行的环境 kube-proxy的主要功能&#xff1a; 术业有专攻&#xff0c; kube-proxy的主要功能可以概括为4个字 网络规则 那么kube-proxy自己其实是个daemonset控制器跑的 每个节点上都有个的pod 它负责网络规则 其实呢 它还是个小…

vue3中watch的用法以及使用场景以及与watchEffect的使用对比

在 Vue 3 中&#xff0c;watch 和 watchEffect 是响应式系统的重要工具&#xff0c;帮助开发者监听数据变化并执行副作用操作。为了让你更好地理解 watch 和 watchEffect 的用法及其区别&#xff0c;这里将详细解释它们的使用方式、适用场景以及它们在基本类型和引用类型上的监…

maven本地打jar包依赖

本地工程的pom文件中引入了mysql依赖&#xff0c;但是在maven库中没有拉下来&#xff0c;可以到mysql官网下载jar包&#xff0c;使用maven手动打包到本地仓库中&#xff1a; 官网地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 在jar包所在位置的路…

06_Linux 文件权限与管理命令

系列文章导航&#xff1a;01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 Linux 文件权限与管理命令一、Linux 文件类型二、用户/组管理用户相关文件用户信息解析用户密码管理&#xff1a;shadow 阴影文件解析用户管理命令1. **useradd**&#xff1a;添加新用户2. **user…

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 &#x1f680;0.前言 &#x1f688;1.string 构造函数 &#x1f69d;1.1string构造函数 &#x1f69d;1.2string拷贝构造函数 &#x1f688;2.string类的使用 &#x1f69d;2.1.查询元素个数或空间 返回字符串中有效字符的个数&#xff1a;size lenth 返回字符串目…

JavaScript 中如何实现函数缓存

在JavaScript中&#xff0c;函数缓存是一种优化技术&#xff0c;它通过将函数的计算结果存储起来&#xff0c;以避免在后续调用中重复计算相同的值。这特别适用于那些计算成本高昂且输入参数有限的函数。以下是实现函数缓存的几种常见方法&#xff1a; 1. 使用对象作为缓存 这…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…

【机器学习】13. 决策树

决策树的构造 策略&#xff1a;从上往下学习通过recursive divide-and-conquer process&#xff08;递归分治过程&#xff09; 首先选择最好的变量作为根节点&#xff0c;给每一个可能的变量值创造分支。然后将样本放进子集之中&#xff0c;从每个分支的节点拓展一个。最后&a…

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp&#xff08;如果安装了则跳过&#xff09;启动xrdp服务 3.3 远程服务…

为什么需要MQ?MQ具有哪些作用?你用过哪些MQ产品?请结合过往的项目经验谈谈具体是怎么用的?

需要使用MQ的主要原因包括以下几个方面‌&#xff1a; ‌异步处理‌&#xff1a;在分布式系统中&#xff0c;使用MQ可以实现异步处理&#xff0c;提高系统的响应速度和吞吐量。例如&#xff0c;在用户注册时&#xff0c;传统的做法是串行或并行处理发送邮件和短信&#xff0c;这…

混个1024勋章

一眨眼毕业工作已经一年了&#xff0c;偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候&#xff0c;本来以为自己这一年没学到多少东西&#xff0c;但是看看自己的博客其实也有在进步&#xff0c;虽然比不上博客里的众多大佬&#xff0c;但是回头看也算是自己的…

Ruby CGI Cookie

Ruby CGI Cookie 在Web开发中,Cookie是一种常用的技术,用于在用户浏览器和服务器之间存储和传递信息。Ruby作为一种流行的编程语言,提供了CGI(Common Gateway Interface)库来处理Cookie。本文将详细介绍如何在Ruby中使用CGI库来创建、读取、修改和删除Cookie。 Cookie的…

如何检查前端项目和 Node 项目中未被使用的依赖包

前言 在日常的开发工作中&#xff0c;随着项目的不断迭代和功能的逐渐增加&#xff0c;我们难免会安装许多依赖包。时间一长&#xff0c;项目中可能会存在一些不再使用的依赖包。这些未被使用的依赖包不仅会增加项目的体积&#xff0c;还可能带来安全隐患。 本文将介绍如何检查…

如果自建 ChatGPT,我会如何从 Model、Inference runtime 构建整个系统

ChatGPT 是一个基于 LLM 的对话系统。本文将介绍如何构建一个类似 ChatGPT 的系统&#xff0c;包括从模型、推理引擎到整体架构的构建过程。 系统概览 让我们关注最核心的对话部分。 如上图所示&#xff0c;web 负责与用户进行交互&#xff0c;server 接受用户的对话请求&…

算法的学习笔记—数组中只出现一次的数字(牛客JZ56)

&#x1f600;前言 在数组中寻找只出现一次的两个数字是一道经典的问题&#xff0c;通常可以通过位运算来有效解决。本文将详细介绍这一问题的解法&#xff0c;深入解析其背后的思路。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;数组中只出现一次的数字…