LeetCode---389周赛

题目列表

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

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

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

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

一、字符串及其反转中是否存在同一子字符串

 直接暴力枚举即可,代码如下

class Solution {
public:bool isSubstringPresent(string s) {bool vis[26][26]={0};// vis[x][y] 表示(s[i-1],s[i])是否出现过for(int i=1;i<s.size();i++){int x = s[i-1]-'a',y = s[i]-'a';vis[x][y]=true;if(vis[y][x])return true;}return false;}
};// 用位运算优化
class Solution {
public:bool isSubstringPresent(string s) {int vis[26]={0};for(int i=1;i<s.size();i++){int x = s[i-1]-'a',y = s[i]-'a';vis[x]|=(1<<y);if(vis[y]>>x & 1)return true;}return false;}
};

二、统计以给定字符开头和结尾的子字符串的总数

这题就是纯数学题,就是要求我们找出特定字符的个数,然后从中选出两个组成子字符串,这题单一字符也符合条件,所以答案为n*(n-1)/2+n,n表示字符串中特定字符的出现次数

代码如下

class Solution {
public:long long countSubstrings(string s, char c) {long long n = count(s.begin(),s.end(),c);return n*(n-1)/2+n;}
};

三、成为K特殊字符串需要删除的最少字符数

仔细读完题目,你会发现这题其实和字符没多大关系,关键是频率,思路如下:

首先我们用freq[26]统计各个字符出现的次数(即频率),然后对freq进行排序,一共就26个字母的频率,我们可以暴力枚举以freq[i]为左端点,freq[i]+k为右端点的频率区间,在该区间内的字符不需要被修改,出现次数在该区间左边的字符要全被删除,出现次数在该区间右边的字符要被减少到freq[i]+k,枚举26次就能得到答案。

如何快速找到freq[i]+k对应的freq数组下标?用二分

如何快速得到前i个字符的出现次数?用前缀和

当然这题的freq数组不是很大,也就26个数,我们也可以直接遍历数组,不用二分+前缀和

代码如下

class Solution {
public:int minimumDeletions(string word, int k) {//统计频率int freq[26]={0};for(const auto&e:word)freq[e-'a']++;sort(freq,freq+26);int pre[27]={0};for(int i=0;i<26;i++) pre[i+1]=pre[i]+freq[i];int ans = INT_MAX;for(int i=0;i<26;i++){if(freq[i]==0) continue;int target=freq[i]+k;int l=i,r=25;while(l<=r){int m=l+(r-l)/2;if(freq[m]>target) r=m-1;else l=m+1;}ans=min(ans,pre[i]+pre[26]-pre[l]-target*(26-l));}return ans;}
};class Solution {
public:int minimumDeletions(string word, int k) {int freq[26]={0};for(const auto&e:word)freq[e-'a']++;sort(freq,freq+26);int ans = 0;for(int i=0;i<26;i++){if(freq[i]==0) continue;int res = 0;for(int j=i;j<26;j++)res += min(freq[j],freq[i]+k);ans=max(ans,res);// 求能保持不变的最大字符数量}return word.size()-ans;}
};

四、拾起K个1需要的最少的行动次数

设 i 为Alice的站立位置的下标,j 为 1 所在位置下标

根据贪心,我们可以归纳出以下几个步骤(按照优先级排序):

a、拿 i 左右两边的1(如果 i 左右是1的话)--- 只需行动 | i - j | = 1次

b、执行操作1将maxChanges个1放在 i 的左边/右边,再执行操作2,拿到1 --- 只需行动2次

c、执行操作2将被 i 附近的1拿到 --- 需要行动 | i - j | >= 2

(如果 i 本身就是1,那么不需要操作就直接拿到一个1,该行动在代码中与步骤a和并了,可以暂不考虑)

如果需要拿出的K个1可以在前两个步骤之内完成,可以直接计算出答案(具体看代码)

否则,我们在前两步得到的x个1的基础上,再得到 K - x 个1即可,很多人都会有这样的思维惯性,但是这样是不正确的,因为步骤a和步骤c是密切相关的,我们在得到x个1时,就已经确定了Alice的位置,但是这个位置不一定是最优的,因为它还会影响步骤c,所以我们应该把步骤a和步骤c放在一起考虑,步骤b的操作次数单独计算。

如何计算步骤a和步骤c得到的 K - maxChanges 个1需要的最少操作次数?

其实观察它们的表达是| i - j | 我们就能知道,我们要求的是  K - maxChanges 个1 到达某个位置的最短的距离和,用中位数贪心【中位数贪心的证明如下】

代码如下

class Solution {
public:long long minimumMoves(vector<int>& nums, int k, int maxChanges) {int n = nums.size();vector<int>pos;// 求连续1的个数int mx = 0;for(int i = 0; i < n; i++){if(nums[i]==0) continue;pos.push_back(i);//记录1出现的位置int j=i++;while(i<n&&nums[i]){pos.push_back(i);//记录1出现的位置i++;}mx=max(mx,i-j);}mx = min(3,min(k,mx));if(mx+maxChanges>=k)return max(mx-1,0)+(k-mx)*2LL;// 只用步骤a/步骤a+步骤b的操作次数int size = k - maxChanges; // 步骤a+步骤c需要的1的个数int m = pos.size();long long pre[m+1]; pre[0] = 0;for(int i = 0; i < m; i++) pre[i+1] = pre[i] + pos[i];long long ans = LLONG_MAX;for(int i = 0; i + size-1 < m; i++){int l = i, r = i + size - 1;int m = l + (r-l)/2;// pos[m]是中位数long long left = 1LL*(m-l)*pos[m]-(pre[m]-pre[l]);long long right = pre[r+1]-pre[m+1]-1LL*(r-m)*pos[m];ans = min(ans, left+right);}return ans+2LL*maxChanges;}
};

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

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

相关文章

【PHP + 代码审计】数组函数

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

力扣面试150 x 的平方根 二分 换底法 牛顿迭代法 一题多解

Problem: 69. x 的平方根 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 袖珍计算器算法 class Solution {public int mySqrt(int x){if (x 0)return 0; // Math.exp(3)&#xff1a;e的三次方int ans (int) Math.exp(0.5 * Math.log(x));return (long) (an…

配置环境安装包遇到的问题

1. error: could not install packages due to an oserror: [errno 28] no space left on device 说是磁盘占用过多&#xff0c;查看磁盘占用情况。 df -h 果然占比100% 清理了众多缓存.cache都不行&#xff0c;而且其他利用率很低&#xff0c;可能是pip install的过程中使…

qt 实现 轮播图效果,且还有 手动 上一页和下一页 已解决

QT中有 轮播图的需求&#xff0c;按照正常html版本 。只需要配置数组就能搞定&#xff0c;但是c qt版本 应该用什么了。 第一想到的是采用定时器。 // 定时器初始化{m_pTime new QTimer(this);m_pTime->start(4 * 1000);//启动定时器并设置播放时间间隔m_pAutoFlag true;/…

【python】python turtle绘制坤坤打球

一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现模块报错 进入控制台输入&#xff1a;建议使用国内镜像源 p…

智慧公厕:跨界融合,打造智慧城市新名片

随着城市化进程的不断加快&#xff0c;公共厕所建设成为一个亟待解决的问题。传统的公厕存在着管理繁琐、卫生差、服务不到位等一系列问题&#xff0c;与城市发展的节奏不协调。为此&#xff0c;推进新型智慧公厕建设成为了一个重要的解决方案。智慧公厕的建设需要推进技术融合…

【论文精读】VIT:vision transformer论文

相关文章 【论文精读】Transformer&#xff1a;Attention Is All You Need 文章目录 相关文章一、文章概览&#xff08;一&#xff09;研究背景&#xff08;二&#xff09;核心思路&#xff08;三&#xff09;相关工作&#xff08;三&#xff09;文章结论 二、模型细节&#x…

【MySQL系列】优化数据库时区设置,确保数据一致性与准确性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

图论基础|深度优先dfs、广度优先bfs

dfs 与 bfs 区别 提到深度优先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不说和广度优先搜索&#xff08;bfs&#xff09;有什么区别 先来了解dfs的过程&#xff0c;很多录友可能对dfs&#xff08;深度优先搜索&#xff09;&#xff0c;bfs&#xff08;广度优先搜索…

鸿蒙Harmony应用开发—ArkTS-@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

MySQL--select count(*)、count(1)、count(列名) 的区别你知道吗?

MySQL select count(*)、count(1)、count(列名) 的区别&#xff1f; 这里我们先给出正确结论&#xff1a; count(*)&#xff0c;包含了所有的列&#xff0c;会计算所有的行数&#xff0c;在统计结果时候&#xff0c;不会忽略列值为空的情况。count(1)&#xff0c;忽略所有的列…

AtCoder Beginner Contest 346

A. Adjacent Product(循环) 题意 给出 N N N个数字 A 1 , A 2 , … , A N A_1, A_2, \ldots, A_N A1​,A2​,…,AN​。定义 B i A i A i 1 ( 1 ≤ i ≤ N − 1 ) B_i A_i \times A_{i 1}(1 \le i \le N - 1) Bi​Ai​Ai1​(1≤i≤N−1)。 请你打印 B 1 , B 2 , … , B …

javase day09笔记

第九天课堂笔记 构造方法★★★★ 完成对属性赋值构造方法的名字必须与类名一致没有返回值类型public 类名&#xff08;【参数】&#xff09;{ }构造方法在创建对象时同步执行没写无参构造&#xff0c;系统默认提供写了构造方法&#xff0c;系统不再提供构造方法:重载 引用数…

牛客NC108 最大正方形【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e 思路 动态规划: 先初始化第一行和第一列。然后其他单元格依赖自己的上边&#xff0c;左边和左上角参考答案Java import java.util.*;public class Solution {/*** 代码中的类…

Naive UI:一个 Vue 3 组件库,比较完整,主题可调,使用 TypeScript,快有点意思。

在当今的前端开发领域&#xff0c;Vue 3已成为中后台应用的首选框架。为了满足开发者的需求&#xff0c;各种组件库如雨后春笋般涌现。其中&#xff0c;Naive UI以其独特的优势&#xff0c;成为了Vue 3开发者的得力助手。本文将深入探讨Naive UI的特性、优势以及如何使用它来提…

docker镜像安装空间不足no space left on device

报错&#xff1a;Error processing tar file(exit status 1): open /usr/local/lib/libmkl_tbb_thread.so.1: no space left on device 原先docker模型保存位置&#xff1a; docker info -f ‘{{ .DockerRootDir}}’ docker 高点版本&#xff0c;这里26.0 解决参考&#xf…

学习次模函数-第1章 引言

许多组合优化问题可以被转换为集合函数的最小化&#xff0c;集合函数是在给定基集合的子集的集合上定义的函数。同样地&#xff0c;它们可以被定义为超立方体的顶点上的函数&#xff0c;即&#xff0c;其中是基集合的基数-它们通常被称为伪布尔函数[27]。在这些集合函数中&…

Linux 创建交换空间

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

鸿蒙Harmony应用开发—ArkTS-应用级变量的状态管理

状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态。 说明&#xff1a; 本模块首批接口从API version 7开始支持&#xff0c;后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本文中T和S的含义…

“文本魔术师:Python玩转文字格式转换“

Hey小伙伴们&#xff0c;今天我们要一起探索一个超级实用的小技能——Python文字转换器&#xff01;想象一下&#xff0c;你的文字作品能瞬间变换成小说、诗歌、甚至是密码&#xff0c;是不是很酷&#xff1f;跟着我&#xff0c;咱们一步步来学习如何用Python实现这个神奇的功能…