博客
关于我
[LeetCode 周赛185] 3. 数青蛙(递推、分析、巧妙解法)
阅读量:565 次
发布时间:2019-03-09

本文共 1797 字,大约阅读时间需要 5 分钟。

文章目录

1. 题目来源

  • 题目来源于一个经典的青蛙跳跃编程问题,题目要求计算在给定字符串中,青蛙能完成跳跃的最少线程数。

2. 题目说明

  • 包含两个图片链接(图片内容为本文的核心编程问题描述),详细展示青蛙跳跃的状态转换及其编程逻辑。

3. 题目解析

  • 详细分析使用递推+分析+巧妙解法解决该问题。

3.1 方法一:递推+分析+巧妙解法

  • 思路

    一个线程输出一个“croak”,可以连续输出,但只能算作一个线程。
    共同的目标:在字符串中实时跟踪青蛙的状态变化,计算最多有多少个线程同时被占用。

  • 数组结构

    使用二维数组dp[MAXN][5],用于记录处于字符串位置i,处于 状态c r o a k的线程数量。

  • 状态转换规则

    • 当前字符为'c',表示新线程启动,状态置为0,并自增当前状态。
    • 其他字符不为'c',则状态转移自增当前状态并自减前一个状态。
  • 更新策略

    • 遍历字符串,每一步更新当前状态和前一个状态的数值。
    • 若出现负值,反馈错误。

3.2 解决方案

  • 使用1维数组实现状态转换,减少内存占用并提升效率。
  • 最终求和所有状态的总线程数,确定最大线程数。

4. 相关代码

// 以下是完整代码实现const int MAXN = 1e5 + 50;int dp[MAXN][5];int c2i(char x) {    if (x == 'c') return 0;    if (x == 'r') return 1;    if (x == 'o') return 2;    if (x == 'a') return 3;    if (x == 'k') return 4;    return -1;}class Solution {    public:        int minNumberOfFrogs(string str) {            if (str.empty()) return 0;            int n = str.size();            int ans = 0;            if (n == 0) return 0;            for (int i = 1; i <= n; ++i) {                char c = str[i - 1];                int cur = c2i(c);                if (cur == -1) return -1;                if (cur == 0) {                    dp[i][0]++;                } else {                    dp[i][cur]++;                    dp[i][cur - 1]--;                }                for (int k = 0; k < 4; ++k) {                    dp[i][k] += dp[i - 1][k];                }                for (int k = 0; k < 5; ++k) {                    if (dp[i][k] < 0) return -1;                }                int sum = 0;                for (int k = 0; k < 5; ++k) {                    sum += dp[i][k];                    if (sum > ans) ans = sum;                }            }            for (int k = 0; k < 4; ++k) {                if (dp[n][k] != 0) {                    return -1;                }            }            return ans;        }};

转载地址:http://lghpz.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
查看>>
OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
查看>>
OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
查看>>
OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
查看>>
OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
查看>>
OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
查看>>
OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
查看>>
OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
查看>>
OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
查看>>
OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
查看>>
OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
查看>>
OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
查看>>
OpenCV与AI深度学习 | 什么是 COCO 数据集?
查看>>
OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
查看>>
OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
查看>>