Leetcode 第 389 场周赛题解

Leetcode 第 389 场周赛题解

  • Leetcode 第 389 场周赛题解
    • 题目1:3083. 字符串及其反转中是否存在同一子字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3084. 统计以给定字符开头和结尾的子字符串总数
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3085. 成为 K 特殊字符串需要删除的最少字符数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3086. 拾起 K 个 1 需要的最少行动次数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 389 场周赛题解

题目1:3083. 字符串及其反转中是否存在同一子字符串

思路

代码

/** @lc app=leetcode.cn id=3083 lang=cpp** [3083] 字符串及其反转中是否存在同一子字符串*/// @lc code=start
class Solution
{
public:bool isSubstringPresent(string s){int n = s.length();for (int i = 0; i < n - 1; i++){string t1 = s.substr(i, 2);for (int j = n - 1; j > 0; j--){string t2 = s.substr(j - 1, 2);reverse(t2.begin(), t2.end());if (t1 == t2)return true;}}return false;}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目2:3084. 统计以给定字符开头和结尾的子字符串总数

思路

假设字符串 s 中有 count 个字符 c。

第一个字符 c 可以和后面 count-1 个 字符 c 组成以 c 字符开头和结尾的非空子字符串。

第二个字符 c 可以和后面 count-2 个 字符 c 组成以 c 字符开头和结尾的非空子字符串。

以此类推。

所以以 c 字符开头和结尾的非空子字符串的总数为 (count-1) + (count-2) + … + 1 = count * (count+1) / 2。

代码

/** @lc app=leetcode.cn id=3084 lang=cpp** [3084] 统计以给定字符开头和结尾的子字符串总数*/// @lc code=start
class Solution
{
public:long long countSubstrings(string s, char c){long long count = 0;for (char &ch : s)if (ch == c)count++;// long long ans = 0;// for (int i = 1; i <= count; i++)//     ans += i;// return ans;return count * (count + 1) / 2;}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目3:3085. 成为 K 特殊字符串需要删除的最少字符数

思路

类似于滑动窗口。

统计好字符的出现次数后,排序,遍历这个数组,假设当前值为 f,则频率的上界为 f+k。

统计频率为 [f, f+k] 的总字符个数,维护其最大值 max_save,那么最少删除个数就是字符串长度 word.length() - max_save。

代码

/** @lc app=leetcode.cn id=3085 lang=cpp** [3085] 成为 K 特殊字符串需要删除的最少字符数*/// @lc code=start
class Solution
{
public:int minimumDeletions(string word, int k){unordered_map<char, int> mp;for (char &c : word)mp[c]++;vector<int> freq;for (auto &[ch, cnt] : mp)freq.push_back(cnt);sort(freq.begin(), freq.end());int min_del = INT_MAX;int front_sub = 0; // 前置差用来存储较小,并且需要减去的数for (int &f : freq){int upper = f + k;int back_sub = 0; // 后置差用来存储后面较大数据需要减去的数for (int &j : freq)if (j > upper)back_sub += j - upper;min_del = min(min_del, front_sub + back_sub);// 如果以后面一个大一点的数为最小值,此时前置差就得加上当前这个数front_sub += f;}return min_del;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n+∣Σ∣),其中 n 是字符串 word 的长度,∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

空间复杂度:O(∣Σ∣),其中 ∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

题目4:3086. 拾起 K 个 1 需要的最少行动次数

思路

动作 1:在一个空位上生成一个 1。这个动作最多可以执行 maxChanges 次。
动作 2:把一个 1 移动到相邻的空位上。

动作 1 + 动作 2 = 在Alice相邻的空位上生成一个 1,再交换给Alice,花费为 2。

我们给Alice选初始位置时,最好选择 1 聚集的地方,具体来讲 1、1(Alice)、1 是比较好的。

在这里插入图片描述

这是一个货仓选址问题。

在这里插入图片描述

代码

/** @lc app=leetcode.cn id=3086 lang=cpp** [3086] 拾起 K 个 1 需要的最少行动次数*/// @lc code=start
class Solution
{
public:long long minimumMoves(vector<int> &nums, int k, int maxChanges){vector<int> pos;int c = 0; // nums 中连续的 1 长度for (int i = 0; i < nums.size(); i++){if (nums[i] == 0)continue;pos.push_back(i); // 记录 1 的位置c = max(c, 1);if (i > 0 && nums[i - 1] == 1){if (i > 1 && nums[i - 2] == 1){ // 有 3 个连续的 1c = 3;}else{ // 有 2 个连续的 1c = max(c, 2);}}}c = min(c, k);if (maxChanges >= k - c){// 其余 k-c 个 1 可以全部用两次操作得到return max(c - 1, 0) + (k - c) * 2;}int n = pos.size();vector<long long> preSum(n + 1);for (int i = 0; i < n; i++)preSum[i + 1] = preSum[i] + pos[i];long long ans = LLONG_MAX;// 除了 maxChanges 个数可以用两次操作得到,其余的 1 只能一步步移动到 pos[i]int size = k - maxChanges;for (int right = size; right <= n; right++){// s1+s2 是 j 在 [left, right) 中的所有 pos[j] 到 index=pos[(left+right)/2] 的距离之和int left = right - size;int i = left + size / 2;long long index = pos[i];long long s1 = index * (i - left) - (preSum[i] - preSum[left]);long long s2 = preSum[right] - preSum[i] - index * (right - i);ans = min(ans, s1 + s2);}return ans + maxChanges * 2;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。

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

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

相关文章

Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

5560.树的直径

蛮不错的一道题目&#xff0c;你要利用树的性质分析出&#xff0c;你只需要维护上一次的树的直径的两个端点就好了 #include<iostream>using namespace std; using ll long long; using pii pair<int,int>; const int N 6e510; const int inf 0x3f3f3f3f; cons…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

python接入AI 实现微信自动回复

import numpy as np # 引入numpy库&#xff0c;目的是将读取的数据转换为列表 import pandas as pd # 引入pandas库&#xff0c;用来读取csv数据 from uiautomation import WindowControl # 引入uiautomation库中的WindowControl类&#xff0c;用来进行图像识别和模拟操作 i…

组合ZKP代价:探索ZKP中non-native域运算 最新进展

1. 引言 前序博客&#xff1a; 递归证明——cycles of curves是必选项&#xff1f; ‘Foreign field’ 或 ‘non-native field’ 算术在ZKP&#xff08;zero knowledge proof零知识证明&#xff09;系统中随处可见。若想使用 ZKP 进行&#xff1a; 布尔运算公钥密码学或 证…

机器学习(五) -- 监督学习(3) -- 朴素贝叶斯

系列文章目录及链接 目录 前言 一、朴素贝叶斯通俗理解及定义 二、原理理解及公式 1、概率基础 2、贝叶斯公式 3、拉普拉斯平滑系数 三、**算法实现 四、接口实现 1、新闻数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、朴素贝叶…

[Java线程池]ExecutorService|CompletionService的区别与选择

这段时间对业务系统做了个性能测试&#xff0c;其中使用了较多线程池的技术&#xff0c;故此做一个技术总结。 这次总结的内容比较多&#xff0c;主要是四个&#xff1a; ExecutorServiceCompletionServiceRunnableCallable 前两个是线程池相关接口&#xff0c;后两个是多线…

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具&#xff0c;使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费&#xff08;portainer-ce 是免费的&#xff0c;portainer-ee 是需要授权的&#xff0c;今天安装的是 portainer-ce 版本&#xff09;&…

强力推荐一款具有故障保护和CAN FD 功能的隔离CAN收发器 SiLM5150S

控制器局域网总线(CAN&#xff0c;Controller Area Network)&#xff0c;是一种用于实时应用的串行通讯协议总线&#xff0c;它可以使用双绞线来传输信号&#xff0c;是目前应用最广泛的现场总线之一。CAN协议具有实时性强、可靠性高、传输距离远的特点&#xff0c;适用于各种复…

【智能算法应用】猎人猎物优化算法(HPO)在WSN覆盖中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】猎人猎物算法&#xff08;HPO&#xff09;原理及实现 2.数学模型 3.结果展示 HPO设置区域边长为20&#xff0c;节点数为35&#xff0c;感知半径为2.5&#xff0c;实验结果如下&#xff1a; 4.参考…

博客部署001-centos安装docker

1、安装docker 1.1 卸载旧版本的 Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine1.2 设置 Docker 仓库 安装 Docker Engine 之前&#xff0c;首先需要设置…

ABAP 读取EXCEL 内容,OLE

代码: INCLUDE OLE2INCL. DATA: GS_EXCEL TYPE OLE2_OBJECT , GS_WBOOKLIST TYPE OLE2_OBJECT, GS_SHEETS TYPE OLE2_OBJECT, GS_CELL1 TYPE OLE2_OBJECT , CELL TYPE OLE2_OBJECT, ROWS …