力扣381周赛

2024-01-25 01:12
文章标签 力扣 周赛 381

本文主要是介绍力扣381周赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣第381场周赛

文章目录

  • 力扣第381场周赛
    • 输入单词需要的最少按键次数 I
    • 按距离统计房屋对数目 I
    • 输入单词需要的最少按键次数 II
    • 按距离统计房屋对数目 II

输入单词需要的最少按键次数 I

贪心模拟

class Solution {
public:int minimumPushes(string word) {int n = word.size() , ans = 0;for(int i = 0 ; i < n ; i ++){if(i >= 0 && i <= 7)ans += 1;else if(i >= 8 && i < 16)ans += 2;else if(i >= 16 && i < 24)ans += 3;else ans += 4;}return ans;}
};

按距离统计房屋对数目 I

跑一边floyd然后对每两个点统计

class Solution {
public:vector<int> countOfPairs(int n, int x, int y) {vector<vector<int> >d(n + 1 , vector<int>(n + 1));vector<int> ans(n);for(int i = 1 ; i <= n  ; i ++){for(int j = 1 ; j <= n ; j ++){if(i == j)d[i][j] = 0;else d[i][j] = 1e9;}}for(int i = 1 ; i < n ; i ++){d[i][i + 1] = d[i + 1][i] = 1;}if(x != y) d[x][y] = d[y][x] = 1;for (int k = 1; k <= n; k ++ )for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )d[i][j] = min(d[i][j], d[i][k] + d[k][j]);for(int i = 1 ; i <= n ; i ++){for(int j = 1 ; j <= n ; j ++){if(d[i][j] - 1 >= 0)ans[d[i][j] - 1]++;}}return ans;}
};

输入单词需要的最少按键次数 II

在I的基础上价格哈希表即可

class Solution {
public:int minimumPushes(string word) {map<char,int> m;int n = word.size() , ans = 0;vector<int> v(30);for(auto x: word){m[x] ++;}int i = 1;for(auto [x , y] : m){v.push_back(y);}sort(v.begin() , v.end());reverse(v.begin() , v.end());for(auto y : v){if(i >= 1 && i <= 8)ans += y;else if(i >= 9 && i <= 16)ans += (2 * y);else if(i > 16 && i <= 24)ans += (3 * y);else ans += (4 * y);i ++;}return ans;}
};

按距离统计房屋对数目 II

分类讨论

class Solution {
public:vector<long long> countOfPairs(int n, int X, int Y) {if (X > Y) swap(X, Y);vector<long long> ans(n + 1);// 情况三:计算长度为 len 的链内部的贡献auto inner = [&](int len) {for (int i = 1; i <= len; i++) ans[i] += (len - i) * 2;};if (X == Y) {// 没有环的特殊情况inner(n);ans.erase(ans.begin());return ans;}// 情况二:计算元素值为 2,第一个窗口的开头为 L,最后一个窗口的开头为 R 的滑动窗口的贡献auto gao = [&](int L, int R, int len) {// 用差分数组维护滑动窗口经过的值long long delta[n + 2];memset(delta, 0, sizeof(delta));for (int i = L; i <= R; i++) delta[i] += 4, delta[i + len] -= 4;long long now = 0;// 求差分数组前缀和,即可得到对每个距离的贡献for (int i = L; i < R + len; i++) {now += delta[i];ans[i] += now;}};int len = Y - X + 1;vector<int> chains;//链的长度if (n - Y > 0) chains.push_back(n - Y);if (X > 1) chains.push_back(X - 1);if (len & 1) {// 环长为奇数// 情况一:计算环内部的贡献for (int i = 1; i <= len / 2; i++) ans[i] += len * 2;// 情况二:计算一个点在环,一个点在链的贡献for (int c : chains) gao(2, c + 1, len / 2);} else {// 环长为偶数// 情况一:计算环内部的贡献for (int i = 1; i < len / 2; i++) ans[i] += len * 2;ans[len / 2] += len;// 情况二:计算一个点在环,一个点在链的贡献for (int c : chains) {gao(2, c + 1, len / 2 - 1);for (int i = 1; i <= c; i++) ans[i + len / 2] += 2;}}// 情况三:计算链内部的贡献int sm = 2;for (int c : chains) sm += c;inner(sm);// 扣除重复计算的贡献ans[1] -= 2;for (int i = Y + 1; i <= n; i++) ans[i - Y + 1] -= 2;for (int i = X - 1; i > 0; i--) ans[X - i + 1] -= 2;ans.erase(ans.begin());return ans;}
};

这篇关于力扣381周赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641639

相关文章

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV 👨‍🏫 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释,包括每个部分的作用和注释: -- 计算每个玩家登录后第二天参与活动的比例select round(avg(a.event_date is not null), 2) as fractio

力扣-2663

题目 如果一个字符串满足以下条件,则称其为 美丽字符串 : 它由英语小写字母表的前 k 个字母组成。它不包含任何长度为 2 或更长的回文子字符串。 给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。 请你找出并返回一个长度为 n 的美丽字符串,该字符串还满足:在字典序大于 s 的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。 对于长度相同的两个字符串 a

力扣SQL50 超过5名学生的课

Problem: 596. 超过5名学生的课 Code select classfrom coursesgroup by classhaving count(distinct student) >= 5;

力扣刷题 杨辉三角(使用c++ vector解法)

杨辉三角 题目描述示例1示例2提示:代码 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例2 输入: numRows = 1

力扣SQL50 求关注者的数量 分组计数

Problem: 1729. 求关注者的数量 Code select user_id, count(1) followers_countfrom Followers group by user_idorder by user_id;

力扣SQL50 销售分析III having + 条件计数

Problem: 1084. 销售分析III 👨‍🏫 参考题解 Code select s.product_id,p.product_namefrom sales s left join product pon s.product_id = p.product_idgroup by product_idhaving count(if(sale_date between

每日一题——Python代码实现力扣1. 两数之和(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 菜鸡写法 代码分析 时间复杂度分析 空间复杂度分析 改进建议 我要更强 方法1: 使用哈希表(字典) 方法2: 排序和双指针 方法3: 使用集合(仅适用于特殊情况) 哲学和编程思想

194.回溯算法:组合总和||(力扣)

代码解决 class Solution {public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtracing(vector<int>& candidates, int target, int flag, int index, vector<bool>&

193.回溯算法:组合总和(力扣)

代码解决 class Solution {public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtrcing(vector<int>& nums, int target, int flag, int index) {// 如果当前组合的和超过了目标值,则返