须知
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力! 🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对 C++算法 感兴趣的朋友,让我们一起进步!
接上篇:【优选算法篇】模拟算法的艺术:在不确定性中找到解法(上篇)-CSDN博客
引言:通过上篇文章带大家简单了解“位运算算法”,小试牛刀。接下来将让大家感受一下位运算在解题的妙处。
位运算在计算机内存中的重要性体现在以下几个方面:
总结: 位运算在计算机内存中扮演着至关重要的角色,它以其高效、节省内存和低级操作的优势,广泛应用于性能优化、算法设计和系统开发等多个领域。
模拟(Simulation)是指通过数学模型或计算机程序模拟现实世界中的系统或过程,以便研究、分析和预测其行为。模拟通常用于解决无法直接实验或操作的情况,或是当直接实验的成本过高、危险或不可行时。
模拟的核心概念是通过近似或简化真实世界的复杂性,使得我们能够理解和预测系统的行为。模拟不仅可以用于科学研究,还广泛应用于工程、经济、军事、医学等领域。
总结
模拟通过创建现实世界的模型,使我们能够在不实际实验的情况下,分析系统的行为、预测结果和优化决策。其应用跨越了多个领域,尤其在高风险、高成本或难以实验的场景中,模拟技术提供了有效的解决方案。
题目描述:

2.1 算法思路:
解题思路:
numRows 小于 2,意味着我们不需要“Z字形”排列,只需要返回原始字符串。numRows 个字符串的容器 rows,用于存储每一行的字符。i 来指示当前字符应放入哪一行。遍历字符串时: i == 0 或 i == numRows - 1 时,改变方向,即斜线的上下方向反转。flag 控制行指针的增减,当 flag == 1 时,i 增加,表示从上到下放置字符;当 flag == -1 时,i 减小,表示从下到上放置字符。class Solution {
public:
string convert(string s, int numRows) {
// 特殊情况处理:如果 numRows < 2,不需要变换
if (numRows < 2)
return s;
// 创建一个vector,用于保存每一行的字符串
vector<string> rows(numRows);
// 记录当前行数和方向(flag控制行数的增加或减少)
int i = 0, flag = -1;
// 遍历字符串s,将字符按Z字形分布到rows中
for (char c : s) {
rows[i].push_back(c);
// 如果i在第一行或者最后一行,改变方向
if (i == 0 || i == numRows - 1)
flag = -flag;
// 更新i的值
i += flag;
}
// 拼接所有行中的字符,形成结果字符串
string res;
for (const string &row : rows)
res += row;
return res;
}
};rows:
numRows 个字符串,用于存储每一行的字符。根据 numRows 的不同,每一行存储的字符数量不同。s:
i 表示当前字符应该被放入的行。我们首先将 i 设置为 0,表示从第 1 行开始。flag 来表示方向,当 i == 0 或 i == numRows - 1 时,我们会反转 flag 的值,这决定了下一个字符应该放在上行还是下行。这种解法的关键在于理解每个字符在Z字形排列中的具体位置。通过计算每个字符的垂直位置和水平位置,可以直接确定每个字符放入的位置。
具体实现:
在这种解法中,我们模拟一个二维的网格。首先按顺序将字符填入网格的每一行,再通过这种方式生成结果字符串。
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s; // 特殊情况,只有一行,直接返回原字符串
int n = s.size();
vector<string> rows(min(numRows, n)); // 最多有n行,最少有1行
int currentRow = 0;
bool goingDown = false;
for (int i = 0; i < n; ++i) {
rows[currentRow] += s[i];
// 如果当前行是最上面或最下面的行,改变方向
if (currentRow == 0 || currentRow == numRows - 1) {
goingDown = !goingDown;
}
// 更新当前行的索引
currentRow += goingDown ? 1 : -1;
}
string result;
for (const string& row : rows) {
result += row; // 将每行拼接成最终结果
}
return result;
}
};时间复杂度:O(n)
空间复杂度:O(n)
vector<string> 来存储每行的字符。
这是一种更数学化的解法,我们不需要模拟行列,而是直接通过周期计算字符应该放在哪一行。
(numRows - 1) * 2。具体实现:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1 || numRows >= s.size()) return s; // 特殊情况
string result;
int cycleLength = 2 * numRows - 2; // 每个周期的长度
for (int row = 0; row < numRows; ++row) {
for (int j = 0; j + row < s.size(); j += cycleLength) {
result += s[j + row]; // 竖直方向
// 处理斜线部分(在每个周期的中间)
if (row != 0 && row != numRows - 1 && j + cycleLength - row < s.size()) {
result += s[j + cycleLength - row]; // 斜线方向
}
}
}
return result;
}
};时间复杂度:O(n)
空间复杂度:O(n)
n 是字符串 s 的长度。我们遍历了一遍字符串,并在每次迭代时将字符添加到相应的行。rows 数组,最多需要存储整个字符串的字符。该算法通过模拟Z字形的行列排布,利用简单的行指针控制和方向标志,可以高效地将字符串按Z字形转换。
题目描述:


"1",即 ret = "1"。ret 中取出一组连续的相同字符,统计其数量(例如,"111" 说明出现了 3 个字符 1),然后将其描述为 3 个字符 1,即 "31"。n-1 次,每次生成新的字符串 ret。class Solution
{
public:
string countAndSay(int n)
{
string ret = "1"; // 初始化第一个元素
// 生成第2到第n项
for (int i = 1; i < n; i++) {
string tmp; // 存储新的字符串
int len = ret.size();
// 遍历当前字符串
for (int left = 0, right = 0; right < len;) {
// 统计当前字符的连续数量
while (ret[left] == ret[right]) right++;
// 将描述的字符和数量添加到tmp中
tmp += to_string(right - left) + ret[left];
// 更新left和right,跳到下一组连续字符
left = right;
}
ret = tmp; // 更新当前字符串
}
return ret; // 返回最终的第n项
}
};ret = "1",这是报数序列的第一个项。for (int i = 1; i < n; i++) 迭代 n-1 次,每次根据前一项生成当前项。tmp 来存储新的描述结果。for (int left = 0, right = 0; right < len; ) 用于遍历当前字符串 ret,通过两个指针 left 和 right 来统计相同字符的连续长度。while (ret[left] == ret[right]) right++ 用来扩展 right,直到字符不相同为止,这样就能够计算出相同字符的个数(即 right - left)。"31" 表示连续 3 个字符 1)加入到 tmp 中。left 为 right,即跳到下一个新的字符组。ret 就包含了第 n 项的报数序列,返回该结果。递归法的思路是将第 n 项转换为一个递归问题。首先定义递归函数 generate(n),它的任务是根据输入的 n 返回第 n 项。可以通过递归的方式,逐步向下计算,直到计算到第1项为止。
核心思想:
"1"。class Solution
{
public:
string countAndSay(int n)
{
if (n == 1) return "1"; // 基本情况
string prev = countAndSay(n - 1); // 递归计算第 n-1 项
string result = "";
int len = prev.size();
for (int i = 0; i < len;) {
int count = 1;
while (i + 1 < len && prev[i] == prev[i + 1]) {
i++;
count++;
}
result += to_string(count) + prev[i];
i++;
}
return result;
}
};时间复杂度:
K 是第 n 项的长度,n 是项的编号。与模拟法类似,递归过程也会根据字符串的长度进行递归调用。
虽然模拟法是最直观的方法,但有时我们可以通过更加优化的方式,减少不必要的操作和内存分配。比如,在每次生成新的字符串时,直接修改原始字符串而不是生成新字符串,从而减少内存的使用。
class Solution
{
public:
string countAndSay(int n)
{
string result = "1";
for (int i = 1; i < n; i++) {
string temp = "";
int len = result.size();
for (int j = 0; j < len;) {
int count = 1;
while (j + 1 < len && result[j] == result[j + 1]) {
j++;
count++;
}
temp += to_string(count) + result[j];
j++;
}
result = temp;
}
return result;
}
};时间复杂度:
K 是第 n 项的长度。
数学法通过推导出每一项的规律,直接构造每一项。虽然直接用数学方法进行描述看似简便,但由于报数序列的生成遵循一定的模式,依然无法避免对字符串的逐个字符操作。因此,这种方法不常见。
class Solution {
public:
string countAndSay(int n) {
vector<string> arr =
{
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* "","1","11","21","1211","111221","312211","13112221","1113213211","31131211131221","13211311123113112211","11131221133112132113212221","3113112221232112111312211312113211","1321132132111213122112311311222113111221131221","11131221131211131231121113112221121321132132211331222113112211","311311222113111231131112132112311321322112111312211312111322212311322113212221","132113213221133112132113311211131221121321131211132221123113112221131112311332111213211322211312113211","11131221131211132221232112111312212321123113112221121113122113111231133221121321132132211331121321231231121113122113322113111221131221","31131122211311123113321112131221123113112211121312211213211321322112311311222113311213212322211211131221131211132221232112111312111213111213211231131122212322211331222113112211","1321132132211331121321231231121113112221121321132122311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213122112311311123112111331121113122112132113213211121332212311322113212221","11131221131211132221232112111312111213111213211231132132211211131221131211221321123113213221123113112221131112311332211211131221131211132211121312211231131112311211232221121321132132211331121321231231121113112221121321133112132112312321123113112221121113122113121113123112112322111213211322211312113211","311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122211311122122111312211213211312111322211213211321322113311213212322211231131122211311123113223112111311222112132113311213211221121332211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221131112311311121321122112132231121113122113322113111221131221","132113213221133112132123123112111311222112132113311213211231232112311311222112111312211311123113322112132113213221133122112231131122211211131221131112311332211211131221131211132221232112111312111213322112132113213221133112132113221321123113213221121113122123211211131221222112112322211231131122211311123113321112131221123113111231121113311211131221121321131211132221123113112211121312211231131122211211133112111311222112111312211312111322211213211321322113311213211331121113122122211211132213211231131122212322211331222113112211","111312211312111322212321121113121112131112132112311321322112111312212321121113122112131112131221121321132132211231131122211331121321232221121113122113121113222123112221221321132132211231131122211331121321232221123113112221131112311332111213122112311311123112112322211211131221131211132221232112111312211322111312211213211312111322211231131122111213122112311311221132211221121332211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321223112111311222112132113213221123123211231132132211231131122211311123113322112111312211312111322212321121113122123211231131122113221123113221113122112132113213211121332212311322113212221","3113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213213211221113122113121113222112132113213221232112111312111213322112132113213221133112132123123112111311222112132113311213211221121332211231131122211311123113321112131221123113112221132231131122211211131221131112311332211213211321223112111311222112132113212221132221222112112322211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221133112132123222112111312211312112213211231132132211211131221131211132221121311121312211213211312111322211213211321322113311213212322211231131122211311123113321112131221123113112211121312211213211321222113222112132113223113112221121113122113121113123112112322111213211322211312113211","132113213221133112132123123112111311222112132113311213211231232112311311222112111312211311123113322112132113212231121113112221121321132132211231232112311321322112311311222113111231133221121113122113121113221112131221123113111231121123222112132113213221133112132123123112111312111312212231131122211311123113322112111312211312111322111213122112311311123112112322211211131221131211132221232112111312111213111213211231132132211211131221232112111312212221121123222112132113213221133112132123123112111311222112132113213221132213211321322112311311222113311213212322211211131221131211221321123113213221121113122113121132211332113221122112133221123113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112212211131221121321131211132221123113112221131112311332211211133112111311222112111312211311123113322112111312211312111322212321121113121112133221121321132132211331121321231231121113112221121321132122311211131122211211131221131211322113322112111312211322132113213221123113112221131112311311121321122112132231121113122113322113111221131221","1113122113121113222123211211131211121311121321123113213221121113122123211211131221121311121312211213211321322112311311222113311213212322211211131221131211221321123113213221121113122113121113222112131112131221121321131211132221121321132132211331121321232221123113112221131112311322311211131122211213211331121321122112133221121113122113121113222123211211131211121311121321123113111231131122112213211321322113311213212322211231131122211311123113223112111311222112132113311213211221121332211231131122211311123113321112131221123113111231121113311211131221121321131211132221123113112211121312211231131122113221122112133221121113122113121113222123211211131211121311121321123113213221121113122113121113222113221113122113121113222112132113213221232112111312111213322112311311222113111221221113122112132113121113222112311311222113111221132221231221132221222112112322211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321223112111311222112132113213221123123211231132132211231131122211311123113322112111312211312111322111213122112311311123112112322211213211321322113312211223113112221121113122113111231133221121321132132211331121321232221123123211231132132211231131122211331121321232221123113112221131112311332111213122112311311123112112322211211131221131211132221232112111312111213111213211231132132211211131221131211221321123113213221123113112221131112211322212322211231131122211322111312211312111322211213211321322113311213211331121113122122211211132213211231131122212322211331222113112211","31131122211311123113321112131221123113111231121113311211131221121321131211132221123113112211121312211231131122211211133112111311222112111312211312111322211213211321322123211211131211121332211231131122211311122122111312211213211312111322211231131122211311123113322112111331121113112221121113122113111231133221121113122113121113222123211211131211121332211213211321322113311213211322132112311321322112111312212321121113122122211211232221123113112221131112311332111213122112311311123112111331121113122112132113311213211321222122111312211312111322212321121113121112133221121321132132211331121321132213211231132132211211131221232112111312212221121123222112132113213221133112132123123112111311222112132113311213211231232112311311222112111312211311123113322112132113212231121113112221121321132122211322212221121123222112311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122211311123113322113223113112221131112311332211211131221131211132211121312211231131112311211232221121321132132211331221122311311222112111312211311123113322112132113213221133122211332111213112221133211322112211213322112111312211312111322212321121113121112131112132112311321322112111312212321121113122112131112131221121321132132211231131122211331121321232221121113122113121122132112311321322112111312211312111322211213111213122112132113121113222112132113213221133112132123222112311311222113111231132231121113112221121321133112132112211213322112111312211312111322212311222122132113213221123113112221133112132123222112111312211312111322212321121113121112133221121311121312211213211312111322211213211321322123211211131211121332211213211321322113311213212312311211131122211213211331121321122112133221123113112221131112311332111213122112311311123112111331121113122112132113121113222112311311222113111221221113122112132113121113222112132113213221133122211332111213322112132113213221132231131122211311123113322112111312211312111322212321121113122123211231131122113221123113221113122112132113213211121332212311322113212221","13211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321223112111311222112132113213221123123211231132132211231131122211311123113322112111312211312111322111213122112311311123112112322211213211321322113312211223113112221121113122113111231133221121321132132211331121321232221123123211231132132211231131122211331121321232221123113112221131112311332111213122112311311123112112322211211131221131211132221232112111312211322111312211213211312111322211231131122111213122112311311221132211221121332211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221232112111312211312113211223113112221131112311332111213122112311311123112112322211211131221131211132221232112111312211322111312211213211312111322211231131122111213122112311311221132211221121332211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221133112132123222112111312211312112213211231132132211211131221131211322113321132211221121332211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321322113311213212322211322132113213221133112132123222112311311222113111231132231121113112221121321133112132112211213322112111312211312111322212311222122132113213221123113112221133112132123222112111312211312111322212311322123123112111321322123122113222122211211232221123113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112212211131221121321131211132221123113112221131112311332211211133112111311222112111312211311123113322112111312211312111322212321121113121112133221121321132132211331121321132213211231132132211211131221232112111312212221121123222112311311222113111231133211121321321122111312211312111322211213211321322123211211131211121332211231131122211311123113321112131221123113111231121123222112111331121113112221121113122113111231133221121113122113121113221112131221123113111231121123222112111312211312111322212321121113121112131112132112311321322112111312212321121113122122211211232221121321132132211331121321231231121113112221121321133112132112312321123113112221121113122113111231133221121321132132211331221122311311222112111312211311123113322112111312211312111322212311322123123112112322211211131221131211132221132213211321322113311213212322211231131122211311123113321112131221123113112211121312211213211321222113222112132113223113112221121113122113121113123112112322111213211322211312113211","11131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221133112132123222112111312211312112213211231132132211211131221131211132221121311121312211213211312111322211213211321322113311213212322211231131122211311123113223112111311222112132113311213211221121332211211131221131211132221231122212213211321322112311311222113311213212322211211131221131211132221232112111312111213322112131112131221121321131211132221121321132132212321121113121112133221121321132132211331121321231231121113112221121321133112132112211213322112311311222113111231133211121312211231131122211322311311222112111312211311123113322112132113212231121113112221121321132122211322212221121123222112111312211312111322212321121113121112131112132112311321322112111312212321121113122112131112131221121321132132211231131122111213122112311311222113111221131221221321132132211331121321231231121113112221121321133112132112211213322112311311222113111231133211121312211231131122211322311311222112111312211311123113322112132113212231121113112221121321132122211322212221121123222112311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122111213122112311311222112111331121113112221121113122113121113222112132113213221232112111312111213322112311311222113111221221113122112132113121113222112311311222113111221132221231221132221222112112322211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221133112132123222112111312211312111322212321121113121112133221132211131221131211132221232112111312111213322112132113213221133112132113221321123113213221121113122123211211131221222112112322211231131122211311123113321112132132112211131221131211132221121321132132212321121113121112133221123113112221131112311332111213211322111213111213211231131211132211121311222113321132211221121332211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321223112111311222112132113213221123123211231132132211231131122211311123113322112111312211312111322111213122112311311123112112322211213211321322113312211223113112221121113122113111231133221121321132132211331121321232221123123211231132132211231131122211331121321232221123113112221131112311332111213122112311311123112112322211211131221131211132221232112111312211322111312211213211312111322211231131122111213122112311311221132211221121332211213211321322113311213212312311211131211131221223113112221131112311332211211131221131211132211121312211231131112311211232221121321132132211331121321231231121113112221121321133112132112211213322112312321123113213221123113112221133112132123222112311311222113111231132231121113112221121321133112132112211213322112311311222113111231133211121312211231131112311211133112111312211213211312111322211231131122111213122112311311221132211221121332211211131221131211132221232112111312111213111213211231132132211211131221232112111312211213111213122112132113213221123113112221133112132123222112111312211312111322212311222122132113213221123113112221133112132123222112311311222113111231133211121321132211121311121321122112133221123113112221131112311332211322111312211312111322212321121113121112133221121321132132211331121321231231121113112221121321132122311211131122211211131221131211322113322112111312211322132113213221123113112221131112311311121321122112132231121113122113322113111221131221","3113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112212211131221121321131211132221123113112221131112311332211211133112111311222112111312211311123113322112111312211312111322212321121113121112133221121321132132211331121321132213211231132132211211131221232112111312212221121123222112311311222113111231133211121321321122111312211312111322211213211321322123211211131211121332211231131122211311123113321112131221123113111231121123222112111331121113112221121113122113111231133221121113122113121113221112131221123113111231121123222112111312211312111322212321121113121112131112132112311321322112111312212321121113122122211211232221121321132132211331121321231231121113112221121321132132211322132113213221123113112221133112132123222112111312211312112213211231132132211211131221131211322113321132211221121332211231131122211311123113321112131221123113111231121113311211131221121321131211132221123113112211121312211231131122211211133112111311222112111312211312111322211213211321223112111311222112132113213221133122211311221122111312211312111322212321121113121112131112132112311321322112111312212321121113122122211211232221121321132132211331121321231231121113112221121321132132211322132113213221123113112221133112132123222112111312211312112213211231132132211211131221131211322113321132211221121332211213211321322113311213212312311211131122211213211331121321123123211231131122211211131221131112311332211213211321223112111311222112132113213221123123211231132132211231131122211311123113322112111312211312111322111213122112311311123112112322211213211321322113312211223113112221121113122113111231133221121321132132211331222113321112131122211332113221122112133221123113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213122112311311123112112322211322311311222113111231133211121312211231131112311211232221121113122113121113222123211211131221132211131221121321131211132221123113112211121312211231131122113221122112133221121321132132211331121321231231121113121113122122311311222113111231133221121113122113121113221112131221123113111231121123222112132113213221133112132123123112111312211322311211133112111312211213211311123113223112111321322123122113222122211211232221121113122113121113222123211211131211121311121321123113213221121113122123211211131221121311121312211213211321322112311311222113311213212322211211131221131211221321123113213221121113122113121113222112131112131221121321131211132221121321132132211331121321232221123113112221131112311322311211131122211213211331121321122112133221121113122113121113222123112221221321132132211231131122211331121321232221121113122113121113222123211211131211121332211213111213122112132113121113222112132113213221232112111312111213322112132113213221133112132123123112111311222112132113311213211221121332211231131122211311123113321112131221123113112221132231131122211211131221131112311332211213211321223112111311222112132113212221132221222112112322211211131221131211132221232112111312111213111213211231131112311311221122132113213221133112132123222112311311222113111231132231121113112221121321133112132112211213322112111312211312111322212321121113121112131112132112311321322112111312212321121113122122211211232221121311121312211213211312111322211213211321322123211211131211121332211213211321322113311213211322132112311321322112111312212321121113122122211211232221121321132132211331121321231231121113112221121321133112132112312321123113112221121113122113111231133221121321132122311211131122211213211321222113222122211211232221123113112221131112311332111213122112311311123112111331121113122112132113121113222112311311221112131221123113112221121113311211131122211211131221131211132221121321132132212321121113121112133221123113112221131112311332111213213211221113122113121113222112132113213221232112111312111213322112132113213221133112132123123112111312211322311211133112111312212221121123222112132113213221133112132123222113223113112221131112311332111213122112311311123112112322211211131221131211132221232112111312111213111213211231132132211211131221131211221321123113213221123113112221131112211322212322211231131122211322111312211312111322211213211321322113311213211331121113122122211211132213211231131122212322211331222113112211"
*/
};
return arr[n];
}
};时间复杂度:
n 是输入的项数,K 是生成第 n 项所需的字符串长度。具体来说,K 与 n 有关,第 n 项的长度在理论上呈指数增长。
K 随着 n 的增加而增长。
K 是第 n 项的长度。每次迭代中,tmp 和 ret 都是长度为 K 的字符串,因此空间复杂度为 O(K)。
该算法通过每次描述前一项来生成新的项,使用双指针(left 和 right)来计算相同字符的连续数量,并生成新的描述字符串。每次生成新的项时,复杂度会根据当前项的长度增加,因此随着 n 的增加,算法的时间复杂度和空间复杂度呈现一定的增长。
题目描述:

4.1 算法思路:
'c' -> 'r' -> 'o' -> 'a' -> 'k'。hash 来记录当前正在发出每个字符的青蛙数量。这个数组有五个元素,分别代表 'c'、'r'、'o'、'a' 和 'k'。'r' 只能在 'c' 之后出现,'o' 只能在 'r' 之后出现,依此类推。croakOfFrogs 时,我们需要对每个字符进行处理。如果遇到 'c',说明这是新一轮青蛙开始发音的开始,因此我们增加 'c' 的数量;如果遇到其他字符,如 'r',则必须确保对应的前一个字符已经发音过(即之前的 'c' 必须已经出现过),如果没有,则返回 -1。hash 数组。如果 hash[i] 中有未被处理完的青蛙(例如,'c' 还没有完全发音),则返回 -1。hash[n-1],即 'k' 的数量,表示完整的“croak”序列的个数。class Solution
{
public:
int minNumberOfFrogs(string croakOfFrogs)
{
string t = "croak";
int n = t.size();
vector<int> hash(n, 0); // 用数组来模拟哈希表,记录每个字符的青蛙数量
unordered_map<char, int> index; // 字符对应的索引
for(int i = 0; i < n; i++)
index[t[i]] = i; // 初始化字符到索引的映射
for(auto ch : croakOfFrogs)
{
if(ch == 'c')
{
// 如果当前是 'c',且 'k' 还有未发完的(即已经有一个完整的"croak"),
// 则说明需要重新开始新的一轮 'croak'
if(hash[n - 1] != 0)
hash[n - 1]--; // 表示有 'k' 完成,应该减少这个字符的计数
hash[0]++; // 增加一个新的 'c',开始新一轮
}
else
{
int i = index[ch]; // 找到当前字符的索引
if(hash[i - 1] == 0)
return -1; // 如果前一个字符的青蛙还没发出,说明不能继续发出当前字符
hash[i - 1]--; // 前一个字符已经处理,减少它的计数
hash[i]++; // 当前字符计数加1
}
}
// 检查是否所有 'croak' 都是有效的
for(int i = 0; i < n - 1; i++)
if(hash[i] != 0)
return -1; // 如果有中途未发完的青蛙,则返回 -1
return hash[n - 1]; // 返回最后一个字符 'k' 的数量,即为完整 "croak" 的个数
}
};unordered_map<char, int> index 用于记录字符 'c'、'r'、'o'、'a'、'k' 在字符串 "croak" 中的索引位置。通过该映射,可以快速查找每个字符在“croak”中的位置。croakOfFrogs,对于每个字符执行以下操作: 'k',即之前的“croak”已经完成,减少 'k' 的数量,然后新增一个 'c' 来开始新的青蛙。'r' 必须在 'c' 之后,'o' 必须在 'r' 之后,依此类推)。如果前一个字符的数量为 0,说明当前字符不能被处理,返回 -1。hash 数组。如果某个字符的数量不为零,说明有青蛙没有完成报数,返回 -1。'k' 的数量,它代表了完整“croak”序列的个数。这个解法的思路是通过维护五个字符的计数来直接计算最少需要的青蛙数量。通过统计每个字符出现的次数,确保它们能按正确顺序发音。
核心思路:
hash 数组记录每个字符的数量,分别是 'c'、'r'、'o'、'a'、'k' 的计数。'r' 必须在 'c' 后面,'o' 必须在 'r' 后面,依此类推)。class Solution
{
public:
int minNumberOfFrogs(string croakOfFrogs)
{
vector<int> count(5, 0); // 记录五个字符的计数
unordered_map<char, int> charToIndex{{'c', 0}, {'r', 1}, {'o', 2}, {'a', 3}, {'k', 4}};
int frogs = 0; // 当前最少青蛙数量
for (char c : croakOfFrogs)
{
int idx = charToIndex[c];
if (idx == 0)
count[0]++; // 'c' 表示新一轮青蛙开始
else
{
if (count[idx - 1] == 0)
return -1; // 如果前一个字符没有青蛙在发音,则返回 -1
count[idx - 1]--;
count[idx]++;
}
// 更新最少的青蛙数
frogs = max(frogs, count[4]); // 'k' 的数量就是完成的青蛙数量
}
// 确保所有青蛙都发完 'k'
for (int i = 0; i < 4; ++i)
if (count[i] != 0)
return -1;
return frogs; // 返回最少的青蛙数量
}
};时间复杂度:
croakOfFrogs 的长度。
count 数组,空间复杂度是常数。
通过队列来模拟每只青蛙发出“croak”时的状态。队列中的每个元素表示一个正在发出声音的青蛙的状态(即当前青蛙发出字符的位置)。
核心思路:
代码实现:
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
// 定义字符对应的顺序
unordered_map<char, int> charOrder = {{'c', 0}, {'r', 1}, {'o', 2}, {'a', 3}, {'k', 4}};
// 初始化计数器,记录每个字符当前有多少青蛙在发出
vector<int> count(5, 0);
// 队列模拟
queue<int> q; // 用队列存储当前正在发出字符的青蛙
int frogCount = 0; // 用来记录青蛙的数量
for (char c : croakOfFrogs) {
int index = charOrder[c]; // 获取当前字符的顺序
// 如果是 'c',表示开始新的一轮,直接加到队列中
if (index == 0) {
q.push(index);
count[index]++; // 新的青蛙开始发音
} else {
// 对于非 'c',需要检查前一个字符是否已经发音过
if (q.empty() || count[index - 1] == 0) {
return -1; // 如果前一个字符没有青蛙在发音,则无法继续
}
// 前一个字符发音完毕,当前字符也开始发音
count[index - 1]--;
count[index]++;
q.push(index);
}
// 更新最少青蛙数量
frogCount = max(frogCount, (int)q.size());
}
// 检查是否所有青蛙都发完了 'k',即每个青蛙必须完全发出 "croak"
for (int i = 0; i < 4; i++) {
if (count[i] != 0) {
return -1; // 如果某个字符没有发完,返回 -1
}
}
return frogCount;
}
};N 是输入字符串 croakOfFrogs 的长度。我们只遍历一次字符串,并在每次处理字符时执行常数时间的操作(查找、更新计数等)。
hash 数组的大小固定为 5(表示字符 'c'、'r'、'o'、'a'、'k'),且 index 哈希表也仅包含 5 个字符的映射,因此空间复杂度是常数。
这个问题的关键是通过模拟“青蛙”发音的过程,确保字符按正确顺序出现。使用 hash 数组来模拟五个字符的数量状态,并通过检查前一个字符是否发音完成来保证正确的顺序。最终返回的是青蛙同时发出完整“croak”序列的最小数量。
通过上面几个例题,如「Z字行变换」问题的多种解法我们总结出贪心算法在处理时间重叠和区间问题中的高效应用。 贪心算法通过局部最优选择(如判断时间差、间隔计算等)来实现全局最优解,在解决连续区间、时间重叠、资源分配等问题时展现出了简洁和高效的特性。 在处理 区间重叠问题、最大化资源利用 以及 高效求解时间持续问题 等场景时,贪心算法可以显著简化问题求解的复杂度,尤其适用于 时间复杂度敏感 和 大数据规模 的应用场景。
路虽远,行则将至;事虽难,做则必成
亲爱的读者们,下一篇文章再会!!!