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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 1374 - 1377 -> 正文阅读

[数据结构与算法]LeetCode 1374 - 1377

生成每种字符都是奇数个的字符串

假设 n = 5,返回长度为 5 的字符串,保证返回的每个字符都出现奇数次,返回 5 个 a 即可或者返回 abcde 也可以

n = 4,返回 aaab

n 是奇数,返回 n 个 a

n 是偶数,返回 n - 1 个 a,1 个 b,不管是 a 还是 b 都有奇数个

class Solution {
public:
    string generateTheString(int n) {
        string res;
        //如果 n是偶数
        if(n % 2 == 0) res += 'b',n--;
        // n一定是奇数
        while(n--) res += 'a';
        return res;
   }
};

二进制字符串前缀一致的次数

?

?

给出一个二进制字符串编号是 1 ~ n,最初这个字符串的所有位上都是 0

按给定的顺序 flips,从第 0 时刻 ~ 第 n - 1 时刻依次把 当前时刻下对应字符串的位置的值 变成 1

前缀一致需要满足自身的值是 1 并且它左边的所有位的值都是 1; 如果自身是1,中间某个位置出现 0,就不满足前缀一致的情况

前缀一致说明满足当前位置到左边连续的一段都是 1

flips 数组是 1 ~ n 的排列,数据为 1 ~ n 且所有数互不相同

从前往后扫描所有变成 1 的编号,判断哪些时刻变成 1 的编号是从 1 开始的连续的一段(从前往后遍历 flips 数组,如何判断数组的哪些前缀构成了从 1 开始的连续的一段)

2????????1????????3????????5????????4

2??????? ×

1??????? 2??????? √

1??????? 2??????? 3??????? √

1??????? 2??????? 3??????? 5 ?????? ×

1??????? 2??????? 3??????? 4??????? 5??????? √

从前往后遍历数组,记录当前 flips 数组中的最大值,如果最大值是 k,并且已经扫描了 k 个数(意味着有 k 个互不相同的数),说明前 k 个数必然是 1 ~ k

当前最大值 == 扫描数组的个数 == 下标 + 1→ 满足要求的时刻

????????????????2??????? 1??????? 3??????? 5????? ? 4

最大值???? 2???????? 2?????? 3???????? 5??????? 5

扫描个数 1???????? 2?????? 3???????? 4??????? 5

因此满足要求的一共有 3 个时刻

class Solution {
public:
    int numTimesAllBlue(vector<int>& flips) {
        //定义答案 | 记录最大值
        int res = 0,k = 0;
        //从前往后扫描每一个数
        for(int i = 0;i < flips.size();i++){
            //让k取最大值
            k = max(k,flips[i]);
            //k == i + 1说明有一个满足要求的时刻
            if(k == i + 1) res++;
        }
        return res;
    }
};

通知所有员工所需的时间

?

?

n 名员工的 ID 是独一无二的,编号是 0 ~ n - 1

每一个点只有唯 一 一 个父节点,树结构

把 headID 看成根节点,除了根节点之外,其他所有节点都有一个父节点

从根节点往下发通知,分发通知可以看成是并行的过程,用 informTime1 的时间通知他所有的下属,过了 informTime1 时间后同一层的所有子节点会同时收到信息,收到信息后,再有一个 informTime2 的时间通知他们的所有的下属,如果没有下属就不用考虑,问通知完整个公司的所有员工一共需要多长时间?

通知需要的总时间取决于最晚通知到的员工,问从根节点开始走到所有叶子节点的距离的最长值

所有叶子节点的 informTime 是 0

示例2:只有一个主管,其他都是下属,这个主管通知他的所有员工所需要的时间是 1 分钟,所以总时间是 1 分钟

求最长路径 DFS

求当前点走到叶子节点一共要走多远,当前点往两个孩子节点走,走到底,得到的的最大值:孩子节点走到底的最大值? + 当前点的权值,回溯到根的时候,根的最大值就是要求的答案

存储图,需要找到每一个点所有的子节点,用邻接表的方式存储图:1.数组模拟邻接表? 2.二维vector存储图,变长数组 √

数据比较大,不能用邻接矩阵存储

class Solution {
public:
    //存储所有的子节点
    vector<vector<int>> son;
    int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
        son = vector<vector<int>>(n);
        //遍历整个数组
        for(int i = 0;i < n;i++){
            //i不等于根节点
            if(i != headID){
                //存储从根节点走到当前点的路径
                son[manager[i]].push_back(i);
            }
        }
        return dfs(headID,informTime);
    }
    //当前节点
    int dfs(int u,vector<int>& informTime){
        int res = 0;
        //遍历所有的子节点
        for(auto s: son[u]) res = max(res,dfs(s,informTime));
        //加上从当前点传递到子节点的时间
        return res + informTime[u];
    }
};

T秒后青蛙的位置

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:24:47  更:2022-04-15 00:25:11 
 
开发: 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 7:16:34-

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