IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode2147. 分隔长廊的方案数 -> 正文阅读

[数据结构与算法]LeetCode2147. 分隔长廊的方案数

题目概述

在这里插入图片描述

题解

??这个题需要多看图,仔细看图会发现你只能在第 2 i 2i 2i个椅子和第 2 i + 1 2i+1 2i+1个椅子之间摆放屏风( i = 1 , 2 , 3 , . . . i = 1,2,3,... i=1,2,3,...),其他位置都不能摆放屏风,因为其他位置在上一个屏风到这个位置之前的椅子数不够2个。
??那既然只能在第 2 i 2i 2i个椅子和第 2 i + 1 2i+1 2i+1个椅子之间摆放屏风,那么两个位置之间摆放屏风的方法数就是第 2 i + 1 2i + 1 2i+1个椅子的下标和第 2 i 2i 2i个椅子的下标之差,然后根据乘法原理,把这些第2个椅子和第3个椅子之间摆放屏风的方法数、第4个椅子和第5个椅子之间摆放屏风的方法数…乘起来就可以了。
??另外,本题要注意边界条件:如果椅子的个数是奇数个,那么不可能通过摆放屏风分成每块都有两个椅子的块,所以如果椅子个数是奇数个,直接返回0;另外,如果压根没有椅子,那何谈摆放屏风的方法,也返回0.
??下面提供两种实现思路的代码,一种比较蠢,是我理解了大佬的思路后自己实现的,具体就是用一个数组记录每个椅子的下标,然后挑数组中第3个元素和第2个元素作差与返回结果累乘、数组中第5个元素和第4个元素累乘…因为数据比较大记得取模。

class Solution {
public:
    int numberOfWays(string corridor) 
    {
        /*
        遍历一遍数组 如果座位的个数是奇数 那么无解 返回0
        如果座位数目是偶数,那么我们只能在第2i个座位和第2i+1个座位之间摆放屏风
        记录座位的下标 这两个座位之间摆放屏风的方法数等于座位下标之差
        最后把每个方法数乘起来就是结果
        */
        int mod = 1e9 + 7;
        vector<int> chairlocation;
        int size = corridor.size();
        for (int i = 0; i < size; ++i)
        {
            if (corridor[i] == 'S')
            {
                chairlocation.push_back(i);
            }
        }
        int chairnum = chairlocation.size();
        if (chairnum == 0)
        {
            return 0;
        }
        if (chairnum % 2 != 0)
        {
            return 0;
        }
        long long ret = 1;
        for (int i = 1; 2 * i <= chairnum; ++i)
        {
            if (2 * i + 1 < chairnum)
            {
                long long ways = chairlocation[2 * i + 1 - 1] - chairlocation[2 * i - 1];
                ret = (ret * ways) % mod;
            }
        }
        return ret % mod;
    }
};

??这个思路完全没必要实现的这么麻烦,由于只需要奇数的前继,只要遍历时一直更新前继椅子的下标就好了。

class Solution {
public:
    int numberOfWays(string corridor) 
    {
        /*
        化简之前的思路 为了得到第2i个椅子和第2i+1个椅子的下标
        其实没有必要记录每个椅子的下标
        只要当前椅子是第3个、第5个、第7个、第9个椅子的时候
        就可以通过当前椅子的下标减去前一个椅子的下标值得到一次可摆放的屏风数
        累乘起来就可以了
        所以我只要有一个prev记录前一个椅子的下标
        一个chaircnt记录椅子的个数
        如果chaircnt%2 == 1且当前椅子个数>=3时
        就可以计算一次屏风摆放方法数 = i - prev 然后累成就可以
        */    
        int mod = 1e9 + 7;
        int chairnum = 0;
        int size = corridor.size();
        int ret = 1;
        int prev = 0;
        for (int i = 0; i < size; ++i)
        {
            if (corridor[i] == 'S')
            {
                ++chairnum;
                if (chairnum >= 3 && chairnum % 2 == 1)
                {
                    ret = (long)ret * (i - prev) % mod;
                }
                prev = i;
            }
        }
        return chairnum == 0? 0 : (chairnum % 2 == 0 ? ret : 0);
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:49:54  更:2022-01-25 10:51:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:41:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码