算法训练营第二十七天打卡 | 回溯法、LeetCode 77 组合问题 笔试题 | 最小改正字符数、符合条件的不相邻结点数、完美数组

最小改正字符数

给定一个由0和1的字符串和该字符串中某个区间左边界和右边界,要求求出将该区间字符串变成01间隔(例如101、010)的字符串需要改动的最小字符数。

给定输入第一行是n,表示区间数,第二行是该字符串s,接下来n行是左边界l和右边界r。

题目中n满足  1 <= n <= 10^5

 1 <= s.length() <= 10^5

 1 <= l ,r <= 10^5

这道题开始直接自己构造一个等长度符合条件1开头的字符串,和一个0开头的字符串,逐个比较不同字符的个数,后来超时了。这题复杂度O(n * n)确实会超时。考试过程中也没想到前缀和。考完才想起来。这里记录一下正确解法。

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main() {int n;cin >> n;string s;cin >> s;int l, r;string s1 = "";string s2 = "";for (int i = 0; i < s.length(); i++) {if (i % 2 == 0) s1 += "1";else s1 += "0";}for (int i = 0; i < s.length(); i++) {if (i % 2 == 0) s1 += "0";else s2 += "1";}vector<int> d1(s.length() + 1, 0);vector<int> d2(s.length() + 1, 0);for (int i = 1; i <= s.length(); i++) {d1[i] = d1[i - 1] + abs(s1[i - 1] - s[i - 1]);d2[i] = d2[i - 1] + abs(s2[i - 1] - s[i - 1]);}while (n--) {cin >> l >> r;int res = min(d1[r + 1] - d1[l], d2[r + 1] - d1[l]);cout << res << endl;}return 0;
}

符合条件的不相邻结点数

有一棵树,有n个节点,构成一个图。要求求出不相邻节点相乘是偶数的方案数。

输入第一行是n,表示节点个数。后面是n- 1行,每行用u和v表示相邻节点序号数。

其中 1<= n <= 10^5

1 <= u <= 10^5

1 <= v <= 10^5

请给出符合条件的方案数

这题一开始用邻接矩阵 + map统计来做,爆内存了,确实二维矩阵这个规模下会爆。同样也是当时没想起来。考完后意识到也许可以map<int, vector>作为记录子节点的成员结构来实现。

代码如下:

#include <iostream>
#include <map>
#include <vector>using namespace std;int main() {int n;cin >> n;map<int, vector<int>> mymap_vec;int u, v;for (int i = 0; i < n - 1; i++) {cin >> u >> v;mymap_vec[u].push_back(v);mymap_vec[v].push_back(u);}int num = 0;for (int i = 0; i < n; i++) {if (i % 2 == 0 && mymap_vec[i].size() > 0) {num += (n - mymap_vec[i].size());}else {int sum = (n - 1) / 2 + 1;for (int j = 0; j < mymap_vec[i].size(); j++) {if (mymap_vec[i][j] % 2 == 0) sum--;}num += sum;}}cout << num / 2 << endl;return 0;
}

完美数组

这题是用的回溯。其实应该是写出来了,当时测试用例其实有点问题的。

给定一个数组,要求求出该数组所有非空子序列中满足完美数组要求的个数。其中完美数组是指该数组中奇数有奇数个,偶数有偶数个。

输入n表示数组元素个数,下面一行输入n个元素表示数组元素a[i](0,...,n-1)

n满足 1 <= n <= 10^5

a[i] 满足 1 <= a[i] <= 10^5

其实就是个回溯法组合问题,涉及到去重。而回溯法简单来说就是一种依靠递归进行的暴力枚举。每次挑出当前数组中一个值放入path路径数组,并进行递归,递归结束后返回到该处位置时又从path路径数组中去除该元素,如果是字符串则需要一开始保存,后面再赋值回去。这是递归逻辑。循环结束条件是path数组长度满足要求或者满足其他条件,将其值放入记录答案的数组即可。当记录数组访问下标的变量显示到达边界时也要进行处理。

去重逻辑首先要求排序,排完序后相同的值就在相邻位置了,由于在这样的情况下,该值有可能会产生的结果都由这些数中第一个数递归下去存储完了,因此后续需要将下标i移到最后一个该元素相同值位置处,并再借由循环中i++移到下一个不等于该值的元素处进行下一轮判断即可。

看代码直观些,代码如下:

#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;int num = 0;
vector<int> path;
void backtracking(vector<int>& nums, int index, int size, int n1, int n2) {if (path.size() == size) {if (n1 % 2 == 1 && n2 % 2 == 0) num++;num %= (1000000000 + 7);return;}if (index == nums.size()) return;for (int i = index; i < nums.size(); i++) {path.push_back(nums[i]);if (nums[i] % 2 == 0) backtracking(nums, i + 1, size, n1, n2 + 1);else backtracking(nums, i + 1, size, n1 + 1, n2);while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++;path.pop_back();}
}int main() {int n;cin >> n;vector<int> nums;for (int i = 0; i < n; i++) {int x;cin >> x;nums.push_back(x);}sort(nums.begin(), nums.end());for (int i = 1; i < nums.size(); i++) {backtracking(nums, 0, i, 0, 0);}cout << num << endl;return 0;
}

算法训练营第二十七天 | 组合问题

一样的回溯法,稍微改动下即可。

class Solution {
private:vector<int> path;vector<vector<int>> res;void backtracking(int n, int index, int k) {if (path.size() == k) {res.push_back(path);return;}if (index == n + 1) return;for (int i = index; i <= n; i++) {path.push_back(i);backtracking(n, i + 1, k);path.pop_back();}}
public:vector<vector<int>> combine(int n, int k) {backtracking(n, 1, k);return res;}
};

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

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

相关文章

【windows】typora激活教程

申明 个人以为&#xff0c;Typora是最好用的markdown编辑软件&#xff0c;以下内容纯属个人实验&#xff0c;请购买正版license支持作者。 详细步骤 按照以下步骤找到Typora安装目录并修改这个以LicenseIndex开头命名的JavaScript 文件&#xff1a; 找到安装 Typora 的目录…

部署达梦数据库主从配置详细操作DM8

服务器配置 主库 192.168.81.128 实例名 dm-1 从库 192.168.81.129 实例名 dm-2 以下安装部署主从服务器都操作 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld 注意安装前必须创建 dmdba 用户&#xff0c;禁止使用 root 用户安装数据库。…

前端面试:谈谈 JS 垃圾回收机制

垃圾回收 JavaScript 中的内存管理是自动执行的&#xff0c;而且是不可见的。我们创建基本类型、对象、函数……所有这些都需要内存。 当不再需要某样东西时会发生什么? JavaScript 引擎是如何发现并清理它? 可达性 JavaScript 中内存管理的主要概念是可达性。 简单地说…

运维:SSH常用命令简介

SH&#xff0c;全称为Secure Shell&#xff0c;是建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密&…

宝塔Linux面板5.9版本升级新版失败解决方法

下载地址&#xff1a;宝塔Linux面板5.9升级教程 宝塔5.9版本升级最新版宝塔失败&#xff0c;可以参考这份详细教程&#xff08;不断更新中&#xff09; 安装要求&#xff1a; Python版本&#xff1a; 2.6/2.7&#xff08;安装宝塔时会自动安装&#xff09; 内存&#xff1a;1…

EPLAN的国产平替软件?SuperWORKS自动化版第三期收官!

EPLAN的国产平替软件SuperWORKS自动化版&#xff0c;目前已经出了两期教程&#xff0c;可翻阅下方历史视频查看~ EPLAN的国产平替软件&#xff1f;SuperWORKS自动化版尝鲜 EPLAN的国产平替软件——SuperWORKS自动化版教程来袭&#xff01; 今天&#xff0c;我们迎来了这一系…

TypeScript(十六)配置相关(tsconfig配置)

目录 前言 本文收录于TypeScript知识总结系列文章&#xff0c;欢迎指正&#xff01; 常用配置 全部配置 Compiler Options (编译器选项) Type Checking&#xff08;类型检查&#xff09; Modules&#xff08;模块&#xff09; Emit&#xff08;发出&#xff09; Java…

NX二次开发——测量距离(两个对象之间最近、最远距离)

一、概述 最近看到 一些文章比较有趣&#xff0c;所以做个记录&#xff0c;顺便写一下博客&#xff0c;附上全部代码&#xff0c;方便刚从事NX二次开发同僚的理解。本次主要模拟NX自带的测量工具中对两个实体对象进行测量距离。NX系统功能如下所示&#xff1a; 二、代码解析 主…

一图看懂git merge和git rebase的区别!!

一图看懂git merge和git rebase的区别&#xff01;&#xff01; Git 是一个非常流行的版本控制系统&#xff0c;它帮助开发者管理代码的不同版本。在 Git 中&#xff0c;merge 和 rebase 是两种常用的将不同分支的更改合并到一起的方法&#xff0c;但它们在处理方式和结果上有…

CP模型--Raft协议介绍

文章目录 前言一、Raft 是什么&#xff1a;二、Raft的工作原理&#xff1a;2.1 Raft 节点的3中状态&#xff1a;2.2 集群启动 leader 节点的选举&#xff1a;在这里插入图片描述2.3 数据的同步&#xff08;日志复制&#xff09;&#xff1a;2.4 leader 重新选举&#xff1a;2.5…

目前公认的一些好用AI工具

ChatGPT&#xff1a;这是一个广泛推荐和使用的AI聊天机器人&#xff0c;能够进行高效的文本生成和对话管理。它在多个证据中被提及&#xff0c;显示其普遍性和实用性。 Midjourney&#xff1a;这是一款强大的AI绘画工具&#xff0c;特别适合创意写作和图像生成。它在多个来源中…

Git怎么查询当前的仓库情况,比如是否有没添加的到Git版本控制的文件、是否有没追踪的文件、是否有新增的文件?

2024年5月9日&#xff0c;周四上午 在 Git 中&#xff0c;要查询当前仓库的情况&#xff0c;主要关注的是文件的状态&#xff0c;包括已修改&#xff08;modified&#xff09;、已暂存&#xff08;staged&#xff09;和已提交&#xff08;committed&#xff09;的状态。 以下是…

Web 安全漏洞之文件上传

目录 文件上传漏洞及危害 文件名 HTML 和 SVG 软链 服务器磁盘 防御方法 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 文件上传漏洞及危害 文件上传漏洞…

基于Idea搭建Android开发环境

文章目录 下载SDK ManagerAndroid SDK Platform-toolsAndroid SDK Build-toolsAndroid SDKAndroid SDK Extras IDEA设置创建TestApp导入Android Studio创建的项目 下载SDK Manager SDK Manager是Google提供的&#xff0c;专门用于下载/管理&#xff0c;安卓开发中需要用到的工…

CANopen总线_CANOpen开源协议栈

CANopen是自动化中使用的嵌入式系统的通信协议栈和设备配置文件规范。就OSI 模型而言&#xff0c;CANopen 实现了以上各层&#xff0c;包括网络层。 CANopen 标准由一个寻址方案、几个小型通信协议和一个由设备配置文件定义的应用层组成。通信协议支持网络管理、设备监控和节点…

java 解决跨域时遇到问题,怎么来做一个跨域环境

今天遇到一个问题&#xff1a; 关于#java#的问题&#xff1a;java 解决跨域时遇到问题&#xff1a;为什么跨域访问时配置的CorsFilter没有进入&#xff1f;直接访问请求地址时进入了配置的CorsFilter 由于没有实际的跨域环境&#xff0c;因此打算在本机建一个跨域环境&#xff…

Oracle的高级分组函数grouping和grouping_id

在网上对Oracle的高级分组函数grouping和grouping_id的讲解并不多,特别是grouping_id,还有解说有误的。经过1天研究,已经完全掌握了两个函数的作用和用法,下面简单的讲述即可明白。下面给大家分享。 GROUPING 函数 语法:grouping(表达式) 作用: GROUPING将超聚…

庙算兵棋推演AI开发初探(4-调用AI模型)

前面讲了如何开展编写规则脚本型Agent&#xff08;智能体&#xff09;的方法&#xff0c;现在探究一下如何调用知识型&#xff08;一般而言的训练出的模型&#xff09;智能体的方法。 这次调用的是庙算平台的demo&#xff08;网址见图&#xff09; 下载了“知识强化学习型”…

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

MFC:字符串处理

例子 //多字节char* szTest "abc多字节";int nLen strlen(szTest);//9//宽字节wchar_t* szTest2 L"abc多字节";int nlen2 wcslen(szTest2);//6//测试项目配置为Unicodewchar_t* szTesz3 TEXT("abcd");//char* -> CStringCString strTes…