Leetcode 第 381 场周赛题解

Leetcode 第 381 场周赛题解

  • Leetcode 第 381 场周赛题解
    • 题目1:3014. 输入单词需要的最少按键次数 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3015. 按距离统计房屋对数目 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3016. 输入单词需要的最少按键次数 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3017. 按距离统计房屋对数目 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 381 场周赛题解

题目1:3014. 输入单词需要的最少按键次数 I

思路

题目里说了字符串 s 中只要小写字母,所以不用统计 1、#、*、0 这 4 个特殊字符的出现次数。

在这里插入图片描述

代码

// 数学class Solution
{
public:int minimumPushes(string word){// 特判if (word.empty())return 0;int n = word.length();int k = n / 8;return (k * 4 + n % 8) * (k + 1);}
};

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目2:3015. 按距离统计房屋对数目 I

思路

暴力枚举每一个房屋对 (i, j) 的 3 种路径:

  1. i->j:长度为 len1 = j-i;
  2. i->x->y->j:长度为 len2 = abs(i - x) + 1 + abs(j - y);
  3. i->y->x->j:长度为 len3 = abs(i - y) + 1 + abs(j - x)。

取这 3 种路径的最小值作为房屋对 (i, j) 的路径,路径长度 len = min({len1, len2, len3}),因为路径是双向的,在答案数组 ans 中 ans[len - 1] += 2。

最后返回 ans 数组。

代码

/** @lc app=leetcode.cn id=3015 lang=cpp** [3015] 按距离统计房屋对数目 I*/// @lc code=start
class Solution
{
public:vector<int> countOfPairs(int n, int x, int y){vector<int> ans(n, 0);for (int i = 1; i < n; i++)for (int j = i + 1; j <= n; j++){int len1 = j - i;                       // i->jint len2 = abs(i - x) + 1 + abs(j - y); // i->x->y->jint len3 = abs(i - y) + 1 + abs(j - x); // i->y->x->j// 取最短距离作为路径int len = min({len1, len2, len3});ans[len - 1] += 2; // 路径是双向的}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n2),其中 n 是房屋数量。

空间复杂度:O(n),其中 n 是房屋数量。

题目3:3016. 输入单词需要的最少按键次数 II

思路

本题与 3014. 输入单词需要的最少按键次数 I 唯一不同的点在于:

3014. 输入单词需要的最少按键次数 I 中字符串 word 所有字母互不相同,而 3016. 输入单词需要的最少按键次数 II
中字符串 word 的字符可以重复。

在这里插入图片描述

因为我们希望出现次数多的字符的点击次数尽可能少。

我们用一个哈希表 alpha 统计字符串 word 中各个字符 c 出现的次数,按降序排序。

遍历哈希表 alpha,当前下标为 i,当前字符次数为 alpha[i],它的单次点击所需次数为 i/8+1 次,因为我们只有 8 个按钮可以按。把 alpha[i] * (i / 8 + 1) 累加起来,这样得到的总按键次数最小。

代码

/** @lc app=leetcode.cn id=3016 lang=cpp** [3016] 输入单词需要的最少按键次数 II*/// @lc code=start
class Solution
{
public:int minimumPushes(string word){// 特判if (word.empty())return 0;int n = word.size();vector<int> alpha(26, 0);for (char &c : word)alpha[c - 'a']++;sort(alpha.begin(), alpha.end(), greater<int>());int ans = 0;for (int i = 0; i < 26; i++)ans += alpha[i] * (i / 8 + 1);return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 word 的长度。

空间复杂度:O(n),其中 n 是字符串 word 的长度。

题目4:3017. 按距离统计房屋对数目 II

思路

题解:两种分类讨论思路(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=3017 lang=cpp** [3017] 按距离统计房屋对数目 II*/// @lc code=start
class Solution
{
public:vector<long long> countOfPairs(int n, int x, int y){if (x > y){swap(x, y);}vector<int> diff(n + 1);auto add = [&](int l, int r, int v){if (l > r)return;diff[l] += v;diff[r + 1] -= v;};auto update = [&](int i, int x, int y){add(y - i, n - i, -1); // 撤销 [y,n]int dec = y - x - 1;   // 缩短的距离add(y - i - dec, n - i - dec, 1);int j = (x + y + 1) / 2 + 1;add(j - i, y - 1 - i, -1); // 撤销 [j, y-1]add(x - i + 2, x - i + y - j + 1, 1);};auto update2 = [&](int i, int x, int y){add(y - i, n - i, -1);           // 撤销 [y,n]int dec = (y - i) - (i - x + 1); // 缩短的距离add(y - i - dec, n - i - dec, 1);int j = i + (y - x + 1) / 2 + 1;add(j - i, y - 1 - i, -1); // 撤销 [j, y-1]add(i - x + 2, i - x + y - j + 1, 1);};for (int i = 1; i <= n; i++){add(1, i - 1, 1);add(1, n - i, 1);if (x + 1 >= y){continue;}if (i <= x){update(i, x, y);}else if (i >= y){update(n + 1 - i, n + 1 - y, n + 1 - x);}else if (i < (x + y) / 2){update2(i, x, y);}else if (i > (x + y + 1) / 2){update2(n + 1 - i, n + 1 - y, n + 1 - x);}}vector<long long> ans(n);long long sum_d = 0;for (int i = 0; i < n; i++){sum_d += diff[i + 1];ans[i] = sum_d;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是房屋数量。

空间复杂度:O(n),其中 n 是房屋数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/441480.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树-堆实现

目录 Test.c测试代码 test1 test2 test3 &#x1f387;Test.c总代码 Heap.h头文件&函数声明 头文件 函数声明 &#x1f387;Heap.h总代码 Heap.c函数实现 ☁HeapInit初始化 ☁HeapDestroy销毁 ☁HeapPush插入数据 【1】插入数据 【2】向上调整Adjustup❗ …

OpenAI最近推出了ChatGPT的一个新功能,@GPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Matlab plot绘图的 title 语法

x 0:1:10; >> y x.^2 -10*x15; >> plot(x,y) >> title(x_y, interpreter, none) title 里面的 x_y , y不会被当作下标。

百度统计实现网页的PV和UV统计

目录 前言 一、登录注册百度账号 二、新增网站 三、页面埋点 四、统计代码安装检查 五、查看网站概况 前言 最近打算统计下博客网站的浏览量&#xff0c;也就是统计下网站的PV和UV&#xff0c;那么说明是 PV和UV呢&#xff1f;我先做个简单介绍。 什么是PV&#xff1f;…

B3626 跳跃机器人——洛谷(疑问)

题目描述 地上有一排格子&#xff0c;共 &#xfffd;n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 &#xfffd;n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#…

Java-并发高频面试题

1.说一下你对Java内存模型&#xff08;JMM&#xff09;的理解&#xff1f; 其实java内存模型是一种抽象的模型&#xff0c;具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中&#xff0c;再操作的时候需要从主内存中复制一份到本地内存&#xff08;c…

MySQL原理(三)锁定机制

一、介绍&#xff1a; 1、锁的本质 业务场景中存在共享资源&#xff0c;多个进程或线程需要竞争获取并处理共享资源&#xff0c;为了保证公平、可靠、结果正确等业务逻辑&#xff0c;要把并发执行的问题变为串行&#xff0c;串行时引入第三方锁当成谁有权限来操作共享资源的判…

npm 淘宝镜像正式到期

由于node安装插件是从国外服务器下载&#xff0c;如果没有“特殊手法”&#xff0c;就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了&#xff0c;于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本&#xff0c;且同步频率…

使用AKStream对接gb28181

优点&#xff1a;功能比较多&#xff0c;C#开发的&#xff0c;容易修改&#xff0c;内嵌入了zlmk流媒体服务品&#xff0c;启动简单 缺点&#xff1a;sip对摄像头兼容还有问题&#xff0c;大华接入非常不稳定&#xff0c;注册等待时间久&#xff0c;对海康是正常&#xff0c;占…

npm 依赖自动更新,依赖废弃不再烦恼 | 开源日报 No.160

renovatebot/renovate Stars: 14.3k License: NOASSERTION Renovate 是一个自动化的依赖项更新工具&#xff0c;支持多平台和多语言。其主要功能包括获取自动生成的拉取请求来更新您的依赖项、通过定时运行减少噪音以及发现相关软件包文件等。该项目的关键特点和核心优势如下…

-1- Python环境安装

1、Python安装 1、Windows安装Python 进入python官网&#xff1a;Welcome to Python.org点击 download——>all releases&#xff1b;建议选择3.7.2版本&#xff08;网页链接&#xff1a;Python Release Python 3.7.2 | Python.org&#xff09;&#xff1b;下拉&#xff0…

Redis五种数据类型及应用场景

1、数据类型 String(字符串&#xff0c;整数&#xff0c;浮点数)&#xff1a;做简单的键值对缓存 List(列表)&#xff1a;储存一些列表类型的数据结构 Hash(哈希)&#xff1a;包含键值对的无序散列表&#xff0c;结构化的数据 Set(无序集合)&#xff1a;交集&#xff0c;并集…