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

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

相关信息:

题目 1:装满杯子需要的最短总时长

核心思路:

  • 该题的模拟思路是比较简单的,但也有细节需要注意。
    • 首先要清楚的是,当某一种水的数量(也就是数组中某个数值)为 0 的时候,需要的时长为剩余的两个数中更大的那一个
    • 假若三种水的数量都不为 0,则需要将此时数组中最大的数最小的数减一。【这里也可以将最大的数和次大的数消耗掉,因为策略是尽快将最大的数耗掉】
    • 因此可以从题解中知道需要用大根堆来维护实时排序的结果。【这里为了代码简洁我选择每次模拟完后将数组排序】
  • 可以实现 O(1) 时间复杂度的解法,看了评论区才明白是如何实现。
    • 一开始我也猜到要将最大的数量匀到第一小的数量和第二小的数量中,因此对数组进行排序。
    • amount[2] >= amount[0] + amount[1] 的时候,可以知道此时需要最大的数量次数来装满杯子,即直接返回 amount[2] 即可。
    • 但关键是当 amount[2] < amount[0] + amount[1] 的时候,需要返回 ceil(sum(amount)/2)。【做题的时候就是这里卡了很久,我看了几个题解,每个题解的分析还不太一样,具体分析看后面参考内容的链接】

代码实现:

  • 模拟解法代码实现如下:
    class Solution
    {
    public:
        int fillCups(vector<int>& amount)
        {
            int cnt = 0;
            while(1)
            {
                sort(amount.begin(), amount.end());
                if(amount[0] == 0) return cnt + amount[2];
                ++cnt;
                --amount[0], --amount[2];
            }
            return cnt;
        }
    };
    
  • 分类讨论解法代码实现如下:
    class Solution {
    public:
        int fillCups(vector<int>& amount) {
            sort(amount.begin(), amount.end());
            if (amount[0] + amount[1] <= amount[2]) return amount[2];
            else {
                int t = amount[0] + amount[1] - amount[2];
                return (t + 1) / 2 + amount[2];
            }
        }
    };
    

参考内容:

题目 2:无限集中的最小数字

核心思路:

  • 该题是设计题,题目也很直白,就是维护无限集合中的数值,每次会弹出最小数值,同时也可以插入数值。
    • 根据题意可以维护无限集的起始位置,以及无限集前面零散的插入数据。

代码实现:

class SmallestInfiniteSet
{
private:
    int start;
    set<int> ss;
public:
    SmallestInfiniteSet() : start(1) {}
    
    int popSmallest()
    {
        int ans;
        if(ss.empty()) ans = start++;
        else
        {
            ans = min(*ss.begin(), start);
            ss.erase(ss.begin());
        }
        return ans;
    }
    
    void addBack(int num)
    {
        if(num >= start or ss.count(num)) return;
        ss.insert(num);
    }
};

题目 3:移动片段得到字符串

核心思路:

  • 该题做的时候一直没想明白究竟如何才算不可移动,其实直接观察 LRstarttarget 中的索引位置即可。
    • start = "L_"target = "_L",显然返回 false,因为 L 的索引分别为 i = 0j = 1i < j 所以该 L 无法通过左移操作从 ij

代码实现:

  • 双指针解法代码实现如下:【代码来自参考内容链接】
class Solution {
public:
    bool canChange(string &start, string &target) {
        auto s = start, t = target;
        s.erase(remove(s.begin(), s.end(), '_'), s.end());
        t.erase(remove(t.begin(), t.end(), '_'), t.end());
        if (s != t) return false;
        for (int i = 0, j = 0; i < start.length(); ++i) {
            if (start[i] == '_') continue;
            while (target[j] == '_') ++j;
            if (i != j && (start[i] == 'L') == (i < j)) // if start[i] == 'L' and i < j, return false
              return false;
            ++j;
        }
        return true;
    }
};

参考内容:

题目 4:统计理想数组的数目

核心思路:

  • 只能说看了题解也不会做。
  • 只写出了超时的动态规划,之后看了很多题解都看不懂。

代码实现:

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

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