模拟篇——算法浮世绘,探寻模拟之境的计算艺术(2)

前言

上篇我们介绍了模拟算法的原理概念及部分基础题型,本篇将结合进阶题目,深化对于模拟算法的理解运用。

一. 外观数列

1.1 题目链接:https://leetcode.cn/problems/count-and-say/description/

1.2 题目分析:

题目要求按规则返回字符串,元素n代表需要阐述n次,其中每一次都是对上一次元素内容的说明。

例如1->1

2->11

3->21

1.3 思路讲解:

所谓「外观数列」,其实只是依次统计字符串中连续且相同的字符的个数。依照题意,依次模拟即可。

1.4 代码实现:

cpp 复制代码
class Solution {
public:
    string countAndSay(int n) {
        string ret="1";
        //需要解释n-1次
        for(int i=1;i<n;i++)
        {
            string temp;
            int len=ret.size();
            for(int left=0,right=0;right<len;)
            {
                while(right<len&&ret[left]==ret[right])
                {
                    right++;
                }//相同元素的个数
                temp+=(to_string(right-left))+ret[left];
                left=right;//更新left
            }
            ret=temp;//更新每一次解释结果
        }
        return ret;
        
    }
};

二. 数青蛙

2.1 题目链接:https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/

2.2 题目分析:

  • croak单词代表蛙鸣,青蛙必须按顺序c,r,o,a,k依次鸣叫,如果字符串不符合鸣叫顺序,则直接返回-1
  • 同一时间可以有多只青蛙鸣叫
  • 单只青蛙完成本次鸣叫后可以继续鸣叫
  • 求取完成鸣叫所需的最少青蛙数目

2.3 思路讲解:

模拟青蛙的叫声:

  • 当遇到 'r' 'o' 'a' 'k' 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,有没有⻘蛙叫出来。如果有⻘蛙叫出来,那就让这个⻘蛙接下来喊出来这个字符;如果没有,直接返回 -1 ;
  • 当遇到 'c' 这个字符的时候,我们去看看 'k' 这个字符有没有⻘蛙叫出来。如果有,就让这个⻘蛙继续去喊 'c' 这个字符;如果没有的话,就需要再来⼀个⻘蛙。

具体步骤如下:

  1. 创建一个哈希表用来记录字符及其前驱字符的鸣叫情况
  2. 利用croak的下标与哈希表映射对应,分情况一一判断

1.4 代码实现:

cpp 复制代码
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string t="croak";
        int n=t.size();
        vector<int> hash(n);//记录
        unordered_map<char,int> index;//记录字符下标
       for(int i=0;i<n;i++)
       {
         index[t[i]]=i;
       }//index与下标一一对应
       for(auto e:croakOfFrogs)
       {
        if(e=='c')
        {
            if(hash[4]>0)
            {
                hash[0]++;
                hash[4]--;
            }//直接令该青蛙继续鸣叫
            else
            {
                hash[0]++;
            }
        }
        else
        {
            int i=index[e];//该元素下标
            if(hash[i-1]<1)//前方无可继续鸣叫的青蛙
            {
                return -1;
            }
            else
            {
                hash[i-1]--;
                hash[i]++;
            }//更新哈希表
        }
       }
        for(int i=0;i<n-1;i++)
        {
            if(hash[i]!=0)
            {
                return -1;
            }
        }//全部鸣叫后应该只有hash[4]不为0,代表青蛙个数
        return hash[4];
        
    }
};

三. 实际应用场景

  • 工程与科学研究

    模拟算法广泛应用于航空航天、材料科学等领域,如模拟飞行器空气动力学特性或预测新材料的性能。

  • 游戏开发与虚拟现实

    在游戏与VR中,模拟算法赋予虚拟角色真实行为,营造身临其境的体验,例如模拟天气变化或物理碰撞效果。

  • 经济与社会系统建模

    通过模拟市场行为或社会网络传播模式,分析经济政策或舆论传播的潜在影响。

  • 人工智能与机器学习

    模拟环境为强化学习算法提供训练场景,例如无人车的虚拟驾驶测试。

小结

模拟算法在现代科技中扮演着"虚拟工匠"的角色,承载了现实与数字世界的桥梁之梦。它不仅是一种计算工具,更是一门艺术,一种用逻辑与数据描绘现实的艺术。

"镜中缘,风中影,算法描绘万象生。"
让我们踏上这段探索之旅,在数字模拟的镜像中窥见未来的可能性。

本篇关于模拟算法的讲解就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

相关推荐
Coovally AI模型快速验证27 分钟前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.82429 分钟前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun30 分钟前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao341 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11331 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆2 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路3 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程3 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
你知道网上冲浪吗3 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
△曉風殘月〆4 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试