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竞赛:20220918双周赛 -> 正文阅读

[数据结构与算法]leetcode竞赛:20220918双周赛

leetcode 周赛

题目一

日期问题:
区间问题:求交集

class Solution {
public:
    int arr[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int countDaysTogether(string arriveAlice, string leaveAlice, string arriveBob, string leaveBob) {
        for (int i = 1; i <= 12; i++) {
            arr[i] += arr[i - 1];
        }
        int a, b, c, d;
        process(arriveAlice, leaveAlice, a, b);
        process(arriveBob, leaveBob, c, d);
        // cout << a << " " << b << endl;
        // cout << c << " " << d << endl;
        if (b < c || d < a) return 0;
        if (a <= c) {
            return min(b, d) - c + 1;
        } else {
             return min(b, d) - a + 1;
        }
        return 0;
        
    }
    
    void process(string& a, string& b, int& c, int& d) {
        int x = (a[0] - '0') * 10 + (a[1] - '0');
        int y = (a[3] - '0') * 10 + (a[4] - '0');
        c = arr[x - 1] + y;
        x = (b[0] - '0') * 10 + (b[1] - '0');
        y = (b[3] - '0') * 10 + (b[4] - '0');
        d = arr[x - 1] + y; 
    }
};

题目二

贪心算法
匈牙利算法

class Solution {
public:
    int matchPlayersAndTrainers(vector<int>& players, vector<int>& trainers) {
        sort(players.begin(), players.end());
        sort(trainers.begin(), trainers.end());
        int n = players.size(), m = trainers.size();
        int res = 0;
        for (int i = 0, j = 0; i < n && j < m;) {
            int a = players[i], b = trainers[j];
            if (a <= b) {
                res++;
                i++, j++;
                continue;
            } else {
                j++;
            }
        }
        return res;
    }
};

题目三

class Solution {
public:
    vector<int> smallestSubarrays(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> x(32, vector<int>(n + 1));
        nums.push_back(INT_MAX);
        vector<int> ret;
        for (int i = n; i >= 0; i--) {
            int res = 1;
            for (int j = 0; j < 31; j++) {
                if (i == n) {
                    x[j][i] = n;
                    continue;
                }
                if (nums[i] & (1 << j)) x[j][i] = i; 
                else x[j][i] = x[j][i + 1];
                if (x[j][i] == n) continue;
                res = max(x[j][i] - i + 1, res);
            }
            ret.push_back(res);
        }
        reverse(ret.begin(), ret.end());
        ret.pop_back();
        return ret;
    }
};

题目四

没写出来.看答案是比较难想的一种枚举。对于任意一遍交易,对于其中的交易 i i i,必须满足等式
m o n e y ? ( a 0 ? b 0 ) ? ( a 1 ? b 1 ) ? ( a 2 ? b 2 ) . . . . > = a i money - (a_0 - b_0) - (a_1 - b_1) - (a_2 - b_2) ....>= a_i money?(a0??b0?)?(a1??b1?)?(a2??b2?)....>=ai?(注意0, 1, 不是数组顺序,而是任意一种交易顺序)。整理一下有:
m o n e y > = ( a 0 ? b 0 ) + ( a 1 ? b 1 ) + ( a 2 ? b 2 ) . . . . + a i money>= (a_0 - b_0) + (a_1 - b_1) + (a_2 - b_2) .... + a_i money>=(a0??b0?)+(a1??b1?)+(a2??b2?)....+ai?
可以看到等式有两部分,前面的每笔交易结果之和与第 i i i笔交易需要的钱的和。这时候转换思维,想象 a i a_i ai?不是第 i i i笔交易,而是对于交易 i i i,我的money最少需要准备多少钱,才能满足最坏情况的交易 i i i,那应该是右边最大。 a i a_i ai?是固定的,那么只需要前面的和最大。前面和最大,要把所有 a > b a>b a>b的交易加起来,答案就呼之欲出了。
贴一个学会之后自己写的代码。

typedef long long LL;
class Solution {
public:
    long long minimumMoney(vector<vector<int>>& transactions) {
        LL sum = 0;
        for (auto &ii : transactions) {
            int a = ii[0], b = ii[1];
            if (a > b) sum += a - b;
        }
        LL res = 0;
        for (auto &ii : transactions) {
            int a = ii[0], b = ii[1];
            if (a > b) res = max(res, a + sum - a + b);
            else res = max(res, a + sum); 
        }
        return res;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:52:38  更:2022-09-21 00:54:19 
 
开发: 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:40:16-

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