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 力扣周赛 282 -> 正文阅读

[数据结构与算法]LeetCode 力扣周赛 282

周赛传送门

个人感觉第四题好有难度,写的我直头晕。

统计包含给定前缀的字符串

思路std::string::find

时间复杂度 O ( n ) \mathrel{O}(n) O(n)

空间复杂度 O ( 1 ) \mathrel{O}(1) O(1)

std::string::findstd::string 的成员函数,可用来获取子串在母串中的位置,其返回值有两种情况:

  • 存在子串:返回第一次出现的第一个字符的下标。
  • 不存在:返回 std::string::npos

因此,可根据返回值是否为 0 来判断是否包含给定前缀。

class Solution {
public:
    int prefixCount(vector<string>& words, string pref) {
        int cnt = 0;
        for (const auto &w : words) {
            if (w.find(pref) == 0) {
                cnt++;
            }
        }
        return cnt;
    }
};

使两字符串互为字母异位词的最少步骤数

思路:统计数量

时间复杂度 O ( ∣ s ∣ + ∣ t ∣ + ∣ ∑ ∣ ) \mathrel{O}(|s|+|t|+|\sum|) O(s+t+)

空间复杂度 O ( ∣ ∑ ∣ ) \mathrel{O}(|\sum|) O()

对于每一种字符 c c c,统计在两个字符串中的数量差记为 d d d,并向较少的那个字符串添加 d d d c c c 即可。因此将 a b s ( d ) abs(d) abs(d) 累加起来即为答案。

class Solution {
public:
    int minSteps(string s, string t) {
        int cnt[2][26] = {0};
        for (auto c : s) { cnt[0][c-'a']++; }
        for (auto c : t) { cnt[1][c-'a']++; }
        int anw = 0;
        for (int i = 0; i < 26; i++) {
            anw += abs(cnt[0][i] - cnt[1][i]);
        }
        return anw;
    }
};

完成旅途的最少时间

思路:二分

时间复杂度 O ( n ln ? t ) \mathrel{O}(n\ln{t}) O(nlnt) t t t 为答案上限,由数据范围可知,取 1 e 14 1e14 1e14 即可。

空间复杂度 O ( 1 ) \mathrel{O}(1) O(1)

设有函数 f ( c ) f(c) f(c) 如下:
f ( c ) = ∑ i = 0 n ? 1 ? ( c t i m e i ) ? f(c) = \sum_{i=0}^{n-1}\lfloor (\frac{c}{time_i}) \rfloor f(c)=i=0n?1??(timei?c?)?

c c c 为花费时间, f ( c ) f(c) f(c) 即为每辆车能完成旅途数的总和。显然,随着 c c c 的增大, f ( c ) f(c) f(c) 必然是单调递增的。又有题目的数据范围可知,答案必在 [ 1 , 1 e 14 ] [1,1e14] [1,1e14] 内。因此在该范围内二分 c c c 即可。

class Solution {
public:
    bool check(int64_t l, const vector<int> &time, int64_t t) {
        int64_t cnt = 0;
        for (auto tt : time) {
            cnt += (l/tt);
            if (cnt >= t) return true;
        }
        return cnt >= t;
    }
    long long minimumTime(vector<int>& time, int totalTrips) {
        int64_t L = 0, R = 100000000000000L;
        while (L <= R) {
            int64_t mid = (L+R)>>1;
            if (check(mid, time, totalTrips)) {
                R = mid-1;
            } else {
                L = mid+1;
            }
        }
        return R+1;
    }
};

完成比赛的最少时间

思路:动态规划,贪心

时间复杂度 O ( ( T + L ) ? c ) \mathrel{O}((T+L)*c) O((T+L)?c) T T T 为轮胎种数, L L L 为圈数, c c c 为单个轮胎的圈数上限。

空间复杂度 O ( L + n ) \mathrel{O}(L+n) O(L+n)

设有一维数组 d p dp dp d p i dp_i dpi? 表示 跑完第 i i i 圈的最短时间,则有:
d p i = min ? j = 0 i ? 1 ( d p j + c h a n g e T i m e + o p t i ? j ) ; dp_i = \min_{j=0}^{i-1} (dp_j + changeTime + opt_{i-j}); dpi?=j=0mini?1?(dpj?+changeTime+opti?j?);

o p t c opt_c optc? 表示连续跑完 c c c 圈不换胎的最短时间。考虑到 c h a n g e T i m e changeTime changeTime 的取值上限为 1 e 5 1e5 1e5 r r r 的最小取值为 2 2 2。又有 2 1 8 > 1 e 5 2^18 \gt 1e5 218>1e5,因此 c c c 的上限可取 18。

另外,需要注意计算过程中由圈数过大引起的溢出问题,对于超出 int32_t 的情形,可通通用 INT_MAX 代替。因为 c h a n g e T i m e changeTime changeTime 远小于该值,这种情形一定不会比其他换胎的策略更优。

class Solution {
public:
    int64_t dp[1001] = {0};

    bool check(int f, int r, int64_t x, int c, int64_t now) {
        int64_t v = c;
        for (int i = 1; i <= x; i++) {
            int64_t s = f;
            for (int j = 1; j < i; j++) {
                if (v+s >= now) return false;
                s *= r;
            }
            v += s;
            if (v >= now) return false;
        }
        return v < now;
    }

    int64_t cal(int f, int r, int x) {
        int64_t v = 0;
        for (int i = 1; i <= x; i++) {
            int64_t s = f;
            for (int j = 1; j < i; j++) {
                s *= r;
                if (s > INT_MAX) { return INT_MAX; }
            }
            v += s;
            if (v > INT_MAX) { return INT_MAX; }
        }
        return v;
    }

    int minimumFinishTime(vector<vector<int>>& tires, int changeTime, int numLaps) {
        int opt[18] = {0};
        for (int i = 1; i < 18; i++) {
            int o = 0;
            for (int j = 0; j < tires.size(); j++) {
                int64_t a = cal(tires[j][0], tires[j][1], i);
                int64_t b = cal(tires[o][0], tires[o][1], i);
                if (a < b) {
                    o = j;
                }
            }
            opt[i] = o;
        }
        memset(dp, -1, sizeof(dp));
        dp[0] = -changeTime;
        for (int i = 0; i <= numLaps; i++) {
            for (int j = 1; j < 18; j++) {
                if (i+j <= numLaps) {
                    if (dp[i+j] == -1 || check(tires[opt[j]][0], tires[opt[j]][1], j, changeTime+dp[i], dp[i+j])) {
                        dp[i+j] = dp[i] + changeTime + cal(tires[opt[j]][0], tires[opt[j]][1], j);
                    }
                }
            }
        }
        return dp[numLaps];
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:39:43  更:2022-03-03 16:43:42 
 
开发: 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 15:32:24-

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