练习题(2024/5/22)

1N 皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

示例 1:

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9

思路:

  1. 回溯算法:

    • 使用回溯算法探索所有可能的解空间。从棋盘的第一行开始,逐行尝试在每一列放置皇后,并检查是否满足 N 皇后问题的要求。
    • 如果当前位置可以放置皇后,则递归到下一行,继续尝试放置下一个皇后。
    • 如果某一行无法放置皇后,或者已经放置了 N 个皇后,尝试改变之前的放置,进行回溯。
  2. isValid 函数:

    • isValid 函数用于检查在给定位置放置皇后是否合法,即是否满足 N 皇后问题的要求。
    • 检查条件包括:列上是否有皇后、左上方是否有皇后、右上方是否有皇后。
  3. 总结解的数量:

    • 使用一个私有变量 count 记录符合条件的解的数量。
    • 每当成功放置 N 个皇后,即遍历完所有行后,增加 count 的值。
  4. totalNQueens 函数:

    • totalNQueens 函数作为入口点,初始化一个大小为 N x N 的棋盘,并调用 backtracking 函数开始搜索解空间。
    • 最终返回符合条件的解的数量。

代码:

class Solution {
private:
int count = 0;
void backtracking(int n, int row, vector<string>& chessboard) {if (row == n) { // 如果已经遍历完所有行,表示找到了一个解count++;return;}for (int col = 0; col < n; col++) {if (isValid(row, col, chessboard, n)) {chessboard[row][col] = 'Q'; // 放置皇后backtracking(n, row + 1, chessboard); // 继续下一行的放置chessboard[row][col] = '.'; // 回溯,尝试其他位置}}
}
bool isValid(int row, int col, vector<string>& chessboard, int n) {// 检查列for (int i = 0; i < row; i++) { // 检查列是否有皇后if (chessboard[i][col] == 'Q') {return false;}}// 检查 45度角是否有皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (chessboard[i][j] == 'Q') { // 检查左上方是否有皇后return false;}}// 检查 135度角是否有皇后for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (chessboard[i][j] == 'Q') { // 检查右上方是否有皇后return false;}}return true; // 该位置可以放置皇后
}public:int totalNQueens(int n) {std::vector<std::string> chessboard(n, std::string(n, '.')); // 初始化棋盘backtracking(n, 0, chessboard); // 回溯搜索解空间return count; // 返回解的个数}
};

2分割回文串 II

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是

回文串

返回符合要求的 最少分割次数 。

示例 1:

输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1

提示:

  • 1 <= s.length <= 2000
  • s 仅由小写英文字母组成

思路:

  1. 构建一个二维数组 isPalindromic,用来记录字符串 s 中每个子串是否为回文串。
  2. 遍历字符串 s,填充 isPalindromic 数组,判断每个子串是否为回文串。
  3. 初始化一个一维数组 dp,用来记录从第一个字符到当前位置字符所需的最小切割次数,初始值为每个位置的索引值。
  4. 动态规划计算最小切割次数:
    • 如果当前位置到第一个位置的子串本身就是回文串,则该位置的最小切割次数为 0。
    • 否则,在前面的子串中找到最小切割次数,并更新当前位置所需的最小切割次数。
  5. 返回 dp 数组中最后一个位置的值,即从第一个字符到最后一个字符的最小切割次数

代码:

class Solution {
public:int minCut(string s) {// 初始化一个二维数组,用来存储从位置 i 到 j 的子串是否是回文串vector<vector<bool>> isPalindromic(s.size(), vector<bool>(s.size(), false));// 填充 isPalindromic 数组for (int i = s.size() - 1; i >= 0; i--) {for (int j = i; j < s.size(); j++) {// 判断 s[i] 到 s[j] 是否是回文串if (s[i] == s[j] && (j - i <= 1 || isPalindromic[i + 1][j - 1])) {isPalindromic[i][j] = true;}}}// 初始化一个一维数组 dp,用来记录从第一个字符到第 i 个字符需要的最小切割次数vector<int> dp(s.size(), 0);for (int i = 0; i < s.size(); i++) {dp[i] = i; // 初始值设为 i}// 动态规划计算最小切割次数for (int i = 1; i < s.size(); i++) {// 如果从第一个字符到第 i 个字符是回文串,最小切割次数为 0if (isPalindromic[0][i]) {dp[i] = 0;continue;}// 在不是回文串的情况下,循环遍历前面的子串找到最小切割次数for (int j = 0; j < i; j++) {if (isPalindromic[j + 1][i]) {// 更新最小切割次数为当前位置与前一个回文串位置的切割次数加 1dp[i] = min(dp[i], dp[j] + 1);}}}return dp[s.size() - 1]; // 返回从第一个字符到最后一个字符的最小切割次数}
};

3最长递增子序列的个数

给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

提示: 

  • 1 <= nums.length <= 2000
  • -106 <= nums[i] <= 106

思路:

  1. 定义状态: 定义两个数组 dp 和 count,其中 dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度,count[i] 表示以第 i 个元素结尾的最长递增子序列的个数。

  2. 状态转移方程: 对于每个元素 nums[i],遍历其之前的元素 nums[j](其中 j < i),如果 nums[i] > nums[j],则:

    • 如果 dp[j] + 1 > dp[i],则更新 dp[i] = dp[j] + 1,并且 count[i] 更新为之前的 count[j]
    • 如果 dp[j] + 1 == dp[i],则累加 count[i] += count[j]
  3. 计算最终结果: 找到最长递增子序列的长度 maxCount,然后遍历 dp 数组,将所有长度为 maxCount 的递增子序列的个数相加,得到最终的结果。

代码:

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {// 如果数组长度小于等于1,直接返回数组长度if (nums.size() <= 1) return nums.size();// 初始化动态规划数组 dp 和计数数组 countvector<int> dp(nums.size(), 1); // dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度vector<int> count(nums.size(), 1); // count[i] 表示以第 i 个元素结尾的最长递增子序列的个数int maxCount = 0; // 用于记录最长递增子序列的长度// 遍历数组进行动态规划for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {// 更新 dp 和 countif (dp[j] + 1 > dp[i]) { // 如果能取得更长的递增子序列dp[i] = dp[j] + 1;count[i] = count[j]; // 更新计数为之前的 count[j]} else if (dp[j] + 1 == dp[i]) {// 如果有相同长度的递增子序列出现,累加计数count[i] += count[j];}}// 更新最长递增子序列的长度if (dp[i] > maxCount) maxCount = dp[i];}}int result = 0; // 最终结果// 统计最长递增子序列的个数for (int i = 0; i < nums.size(); i++) {if (maxCount == dp[i]) result += count[i];}return result;}
};

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

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

相关文章

民国漫画杂志《时代漫画》第18期.PDF

时代漫画18.PDF: https://url03.ctfile.com/f/1779803-1248612707-27e56b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

春秋CVE-2022-23906

简介 CMS Made Simple v2.2.15 被发现包含通过上传图片功能的远程命令执行 (RCE) 漏洞。此漏洞通过精心制作的图像文件被利用。 正文 1.进入靶场2.进入登录界面&#xff0c;弱口令admin/123456 3.进入后台&#xff0c;文件上传点 4.上传一句话木马图片 5.复制图片&#xf…

细胞冻存——让你的细胞“长生不老”

《星际穿越》电影中提到漫长的太空旅程中&#xff0c;宇航员可以进入休眠水床休眠&#xff0c;并自行设定唤醒时间。在《异形》《深空失忆》《三体》等科幻作品中&#xff0c;都出现此类技术。《三体》中&#xff0c;休眠后来成为人类最普遍的一项技术。技术上的人类低温休眠&a…

OpenCV:入门(五)

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也 较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值也较小。一般情 况下&#xff0c;图像梯度计…

中文信息期刊投稿邮箱

《中文信息》杂志是国家新闻出版总署批准的国家级刊物&#xff08;月刊&#xff09;&#xff0c;国内外公开发行&#xff0c;大十六开印刷。本刊主要反映我国中文信息处理的学术水平&#xff0c;重点刊登科技、经济、教育等领域的基础理论、科研与应用技术的学术论文&#xff0…

第2天 搭建安全拓展_小迪网络安全笔记

1.常见搭建平台脚本使用: 例如 phpstudy IIS Nginx(俗称中间件): 什么是中间件: 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务&#xff08;功能&#xff09;&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#…

vue2引入brand.vue和brand-add-or-update.vue后重启项目报错解决方案

最近在用粒谷商城项目练手&#xff0c;学习到P59时引入品牌两个vue文件&#xff0c;重启(npm run dev)项目报错: ERROR Failed to compile with 2 errors 12:11:59Th…

【论文阅读】Rank-DETR(NIPS‘23)

paper:https://arxiv.org/abs/2310.08854 code:https://github.com/LeapLabTHU/Rank-DETR

微信小程序视频怎么保存到本地

你是否遇到过在微信小程序中发现了精彩的视频&#xff0c;却不知道如何将其保存到本地的困扰&#xff1f;别担心&#xff0c;这篇文章将为您揭示2024年最新的保存方法&#xff0c;让您轻松下载和保留这些珍贵的视频内容。不管您是使用安卓设备还是苹果设备&#xff0c;我们都为…

学生手机管理方案

咱们现在的学生&#xff0c;手机几乎成了标配。所以问题就来了&#xff0c;怎么管理这些手机&#xff0c;让手机在课堂上不成为学习的干扰&#xff1f; 先得搞明白&#xff0c;手机在学生手里上该扮演什么角色。手机确实能帮学生查资料、交流学习&#xff0c;甚至写作业&#x…

Log360:护航安全,远离暗网风险

暗网有时候就像是一个神秘的地下世界&#xff0c;是互联网的隐蔽角落&#xff0c;没有任何规则。这是一个被盗数据交易、网络犯罪分子策划下一步攻击的地方。但仅仅因为它黑暗&#xff0c;不意味着你要对潜在的威胁视而不见。 暗网 这就是ManageEngine Log360的用武之地&…

【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins&#xff0c;直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

解决远程链接的“Gtk-WARNING **: cannot open display;

1.需要检查ssh配置中X11Forwarding是否启用 2.检查本地ssh工具是否启用x11转发&#xff08;下图以mobaxterm为例&#xff09; 3.检查是否有防火墙等其他网络拦截&#xff0c;如果没有特殊需求&#xff0c;这里可以直接将防火墙服务关闭 4.按上诉操作检查后&#xff0c;正常情况…

P2P服务端模型配合 Tool.net P2pServerAsync 类使用

Tool.Net 支持的 P2P 服务器模型实例 说明服务器部分相关代码相关调用实例Tcp版本Udp版本 最后附一张思维图 说明 当前文章&#xff0c;仅是Tool.Net 开源库的一个缩影。本次更新V5.0版本以上提供支持。可以提供简单实现P2P功能用于业务开发。 服务器部分相关代码 完整代码&…

JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC&#xff1a;并行回收4. Parallel GC&#xff1a;吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags&#xff1a;查看命令行相关参数&#xff08;包含使用的垃圾收集器&#xff09;使用命令行指令&#xff1a;ji…

数据库系统概论(超详解!!!)第九节 嵌入式SQL

SQL语言提供了两种不同的使用方式 &#xff1a;交互式&#xff0c; 嵌入式。 SQL语言是非过程性语言 。事务处理应用需要高级语言。 这两种方式细节上有差别&#xff0c;在程序设计的环境下&#xff0c;SQL语句要做某些必要的扩充。 1.嵌入式SQL的处理过程 嵌入式SQL是将SQL…

「51媒体」广西媒体资源,南宁活动媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 广西地区拥有丰富的媒体资源&#xff0c;在广西做活动&#xff0c;参加展览可以邀请他们到场采访报道。 央媒驻站&#xff1a;广西新华 广西人民 广西光明 广西央广 广西国际在线 广西中…

Rhinoceros v7.5 解锁版安装教程 (3D三维造型软件)

前言 Rhinoceros 中文名称犀牛是一款超强的三维建模工具&#xff0c;全称Rhinoceros&#xff0c;Rhino是美国Robert McNeel & Assoc开发的PC上强大的专业3D造型软件&#xff0c;它可以广泛地应用于三维动画制作、工业制造、科学研究以及机械设计等领域。它能轻易整合3DS M…

【数据结构】第七节:堆

个人主页&#xff1a; 深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) ​ 目录 一、堆 1.堆的概念 2.堆的定义 二、堆的实现 1.初始化和销毁 2.插入 向上调整算法 3.删除 向下调整算法…