模拟篇——算法浮世绘,探寻模拟之境的计算艺术(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中,模拟算法赋予虚拟角色真实行为,营造身临其境的体验,例如模拟天气变化或物理碰撞效果。

  • 经济与社会系统建模

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

  • 人工智能与机器学习

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

小结

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

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

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

相关推荐
大锦终4 分钟前
【C++】unordered_map与set的模拟实现
开发语言·数据结构·c++·哈希算法
wniuniu_14 分钟前
socc19 echash部分代码讲解 二 hashtable
算法·哈希算法
范纹杉想快点毕业18 分钟前
以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·windows·vscode·qt·visual studio
孤寂大仙v38 分钟前
【Linux笔记】——线程同步条件变量与生产者消费者模型的实现
linux·c++·笔记
ai.Neo44 分钟前
牛客网NC276055:三根木棒能否组成三角形问题详解(ACM中的A题)
数据结构·c++·算法
じ☆ve 清风°1 小时前
滑动窗口算法详解与C++实现
开发语言·c++·算法
苕皮蓝牙土豆1 小时前
C++ map & multimap 容器:赋值、排序、大小与删除操作
开发语言·c++
东莞呵呵1 小时前
吴恩达机器学习(1)——机器学习算法分类
算法·机器学习·分类
虾球xz2 小时前
游戏引擎学习第293天:移动Familiars
c++·学习·游戏引擎
孙同学_2 小时前
【C++】map和set的使用
开发语言·c++