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】【周赛】第 308 场 -> 正文阅读

[数据结构与算法]【leetcode】【周赛】第 308 场

相关信息:

题目 1:和有限的最长子序列

核心思路:

  • 该题理解题意后比较简单。
    • 其实就是对于 queries[i],使得 nums尽量多的元素求和小于等于 queries[i]
    • 因此直接贪心 + 排序 + 前缀和 + 二分即可。
    • 即排序后计算前缀和数组,接着二分找到求和数组中低于 queries[i] 的位置即可。

代码实现:

class Solution
{
public:
    vector<int> answerQueries(vector<int>& nums, vector<int>& queries)
    {
        int n = nums.size(), m = queries.size();
        sort(nums.begin(), nums.end());
        for(int i = 1; i < n; ++i) nums[i] += nums[i-1];
        vector<int> ans(m);
        for(int i = 0; i < m; ++i)
            ans[i] = upper_bound(nums.begin(), nums.end(), queries[i]) - nums.begin();
        return ans;
    }
};

题目 2:从字符串中移除星号

核心思路:

  • 该题几乎就是送分题,比第一题还要简单些。
  • 从前往后模拟的话需要维护栈,从后往前模拟更为简单。
    • 从后往前遍历只需要维护星号的计数即可。

代码实现:

class Solution
{
public:
    string removeStars(string s)
    {
        string ans;
        int cnt = 0;
        for(int i = s.size()-1; i >= 0; --i)
        {
            if(s[i] == '*') ++cnt;
            else if(cnt == 0) ans += s[i];
            else --cnt;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

题目 3:收集垃圾的最少总时间

核心思路:

  • 该题几乎也是送分题。
  • 题目很长,但其实就是贪心解题。
    • 计算每一个垃圾的总处理时间,其实就是计算每一个字符串的长度总和。
    • 接着计算每个垃圾车移动的最远距离。【此处用前缀和即可】

代码实现:

class Solution
{
public:
    int garbageCollection(vector<string>& garbage, vector<int>& travel)
    {
        int cnt = 0;
        for(int i = 1; i < travel.size(); ++i) travel[i] += travel[i-1];
        int a = 0, b = 0, c = 0;
        for(int i = 0; i < garbage.size(); ++i)
        {
            string& tmp = garbage[i];
            cnt += tmp.size();
            if(tmp.find('M') != tmp.npos) a = i;
            if(tmp.find('P') != tmp.npos) b = i;
            if(tmp.find('G') != tmp.npos) c = i;
        }
        if(a != 0) cnt += travel[a-1];
        if(b != 0) cnt += travel[b-1];
        if(c != 0) cnt += travel[c-1];
        return cnt;
    }
};

题目 4:给定条件下构造矩阵

核心思路:

  • 该题其实就是拓扑排序之后重构每个数字所在的行和列,做了半个小时愣是没想起来要用拓扑排序。
  • 行和列的处理是一样的,先理解如何处理行即可。
    • 对于 rowConditions[i] = [above_i, below_i],可以认为 above_ibelow_i 连一条有向边,因此根据其构成的有向图,可以进行拓扑排序,得到的拓扑序就是行中数字的相对顺序。
    • 再根据拓扑序构造矩阵即可。
  • 一开始也想明白要找到相对顺序,但莫名其妙用并查集开始做了,只能说太不熟练,需要多练,该题其实难度不大,只考察了一点拓扑排序。

代码实现:

class Solution
{
private:
    vector<int> topoSort(vector<vector<int>>& edges, int k)
    {
        vector<vector<int>> graph(k+1); // 邻接表
        vector<int> in(k+1); // 入度表
        for(int i = 0; i < edges.size(); ++i)
            ++in[edges[i][1]], graph[edges[i][0]].push_back(edges[i][1]);

        vector<int> ans;
        stack<int> stk;
        // 第一步,初始化,入度为0的节点入栈
        for(int i = 1; i <= k; ++i) if(in[i] == 0)
            stk.push(i);
        // 第二步,拓扑排序
        while(!stk.empty())
        {
            int x = stk.top();
            stk.pop();
            ans.push_back(x);
            for(auto& next : graph[x]) if(--in[next] == 0)
                stk.push(next);
        }
        return ans;
    }
public:
    vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rc, vector<vector<int>>& cc)
    {
        auto row = topoSort(rc, k), col = topoSort(cc, k);
        if(row.size() < k or col.size() < k) return {};
        vector<int> pos(k);
        for(int i = 0; i < k; ++i) pos[col[i]-1] = i;
        vector<vector<int>> ans(k, vector<int>(k));
        for(int i = 0; i < k; ++i)
            ans[i][pos[row[i]-1]] = row[i];
        return ans;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 02:14:52  更:2022-09-15 02:15:20 
 
开发: 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/25 21:24:18-

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