LeetCode第 124 场双周赛个人题解

news/发布时间2024/5/16 5:27:57

目录

相同分数的最大操作数目 I

原题链接

题目描述

接口描述

思路分析

代码详解

3039. 进行操作使字符串为空

原题链接

题目描述

接口描述

思路分析

代码详解

相同分数的最大操作数目 II

原题链接

题目描述

接口描述

思路分析

代码详解

100205. 修改数组后最大化数组中的连续元素数目

原题链接

题目描述

接口描述

思路分析

代码详解


相同分数的最大操作数目 I

原题链接

相同分数的最大操作数目 I - 力扣 (LeetCode) 竞赛

题目描述

给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作:

  • 选择 nums 中的前两个元素并将它们删除。

一次操作的 分数 是被删除元素的和。

在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。

请你返回按照上述要求 最多 可以进行的操作次数。

示例 1:

输入:nums = [3,2,1,4,5]
输出:2
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,4,5] 。
- 删除前两个元素,分数为 1 + 4 = 5 ,nums = [5] 。
由于只剩下 1 个元素,我们无法继续进行任何操作。

示例 2:

输入:nums = [3,2,6,1,4]
输出:1
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
由于下一次操作的分数与前一次不相等,我们无法继续进行任何操作。

接口描述

class Solution {
public:int maxOperations(vector<int>& nums) {}
};

思路分析

直接模拟即可,时间复杂度O(N)

代码详解

class Solution {
public:int maxOperations(vector<int>& nums) {int ret = 0;for(int i = 0, t = -1, n = nums.size(); i < n - 1; i += 2){if(~t && nums[i] + nums[i + 1] != t) return ret;ret++, t = nums[i] + nums[i + 1];}return ret;}
};

3039. 进行操作使字符串为空

原题链接

3039. 进行操作使字符串为空

  

题目描述

  

给你一个字符串 s 。

请你进行以下操作直到 s 为  :

  • 每次操作 依次 遍历 'a' 到 'z',如果当前字符出现在 s 中,那么删除出现位置 最早 的该字符。

请你返回进行 最后 一次操作 之前 的字符串 s 

示例 1:

输入:s = "aabcbbca"
输出:"ba"
解释:我们进行以下操作:
- 删除 s = "aabcbbca" 中加粗加斜字符,得到字符串 s = "abbca" 。
- 删除 s = "abbca" 中加粗加斜字符,得到字符串 s = "ba" 。
- 删除 s = "ba" 中加粗加斜字符,得到字符串 s = "" 。
进行最后一次操作之前的字符串为 "ba" 。

示例 2:

输入:s = "abcd"
输出:"abcd"
解释:我们进行以下操作:
- 删除 s = "abcd" 中加粗加斜字符,得到字符串 s = "" 。
进行最后一次操作之前的字符串为 "abcd" 。

接口描述

  

class Solution {
public:string lastNonEmptyString(string s) {}
};

思路分析

哈希计数+模拟

统计字符集的数目,然后每轮对剩余字符减一,当最大字符数目为1时,我们break,此时剩余的字符就是要返回的字符,其顺序和在s中最后出现位置的相对顺序相同

时间复杂度O(N),空间复杂度O(U),U为字符集大小

代码详解

class Solution
{
public:string lastNonEmptyString(string s){int last[26]{0}, n = s.size(), ma = 0;unordered_map<char, int> mp;string ret;for (int i = 0; i < n; i++)last[s[i] - 'a'] = i, mp[s[i]]++;for (auto p : mp)ma = max(ma, p.second);while (mp.size() && ma > 1){string del;ma = 0;for (auto& p : mp){if (!(--p.second))del.push_back(p.first);elsema = max(ma, p.second);}for(auto x : del) mp.erase(x);}for (auto p : mp){ret.push_back(p.first);}sort(ret.begin(), ret.end(), [&](char x, char y){return last[x-'a'] < last[y-'a'];});return ret;}
};

 

相同分数的最大操作数目 II

原题链接

  相同分数的最大操作数目 II - 力扣 (LeetCode) 竞赛

题目描述

  

给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:

  • 选择 nums 中最前面两个元素并且删除它们。
  • 选择 nums 中最后两个元素并且删除它们。
  • 选择 nums 中第一个和最后一个元素并且删除它们。

一次操作的 分数 是被删除元素的和。

在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。

请你返回按照上述要求 最多 可以进行的操作次数。

示例 1:

输入:nums = [3,2,1,2,3,4]
输出:3
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,2,3,4] 。
- 删除第一个元素和最后一个元素,分数为 1 + 4 = 5 ,nums = [2,3] 。
- 删除第一个元素和最后一个元素,分数为 2 + 3 = 5 ,nums = [] 。
由于 nums 为空,我们无法继续进行任何操作。

示例 2:

输入:nums = [3,2,6,1,4]
输出:2
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
- 删除最后两个元素,分数为 1 + 4 = 5 ,nums = [6] 。
至多进行 2 次操作。

接口描述

  

class Solution
{
public:int f[2005][2005];int maxOperations(vector<int> &nums){}
};

思路分析

区间DP

从数据范围上看应该用O(N^2)的算法,而题目所给操作都是在数组边界上进行,则很容易想到区间dp

首先要明白最大操作次数对应的每次操作的元素和k只有三种情况:nums[0] + nums[1], nums[n - 1] + nums[n - 2], nums[0] + nums[n - 1]

定义状态f[l][r]为最大操作次数对应的每次操作的元素和为k时的最大操作次数

那么转移方程有三,分别对应三种操作:

                if (nums[l] + nums[l + 1] == k)
                    res = max(res, dfs(l + 2, r) + 1);
                if (nums[l] + nums[r] == k)
                    res = max(res, dfs(l + 1, r - 1) + 1);
                if (nums[r - 1] + nums[r] == k)
                    res = max(res, dfs(l, r - 2) + 1);

我们进行三次区间DP即可

时间复杂度O(N^2),空间复杂度O(N^2)

代码详解

class Solution
{
public:int f[2005][2005];int maxOperations(vector<int> &nums){int ret = 0, n = nums.size();for (auto k : {nums[0] + nums[1], nums[n - 1] + nums[n - 2], nums[0] + nums[n - 1]}){memset(f, -1, sizeof(f));function<int(int, int)> dfs = [&](int l, int r){if (l >= r)return 0;if (~f[l][r])return f[l][r];int res = 0;if (nums[l] + nums[l + 1] == k)res = max(res, dfs(l + 2, r) + 1);if (nums[l] + nums[r] == k)res = max(res, dfs(l + 1, r - 1) + 1);if (nums[r - 1] + nums[r] == k)res = max(res, dfs(l, r - 2) + 1);return f[l][r] = res;};ret = max(ret, dfs(0, n - 1));}return ret;}
};

 

100205. 修改数组后最大化数组中的连续元素数目

  

原题链接

  修改数组后最大化数组中的连续元素数目 - 力扣 (LeetCode) 竞赛

题目描述

  

给你一个下标从 0 开始只包含  整数的数组 nums 。

一开始,你可以将数组中 任意数量 元素增加 至多 1 。

修改后,你可以从最终数组中选择 一个或者更多 元素,并确保这些元素升序排序后是 连续 的。比方说,[3, 4, 5] 是连续的,但是 [3, 4, 6] 和 [1, 1, 2, 3] 不是连续的。

请你返回 最多 可以选出的元素数目。

示例 1:

输入:nums = [2,1,5,1,1]
输出:3
解释:我们将下标 0 和 3 处的元素增加 1 ,得到结果数组 nums = [3,1,5,2,1] 。
我们选择元素 [3,1,5,2,1] 并将它们排序得到 [1,2,3] ,是连续元素。
最多可以得到 3 个连续元素。

示例 2:

输入:nums = [1,4,7,10]
输出:1
解释:我们可以选择的最多元素数目是 1 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 106

接口描述

  

class Solution
{
public:int maxSelectedElements(vector<int> &nums){}
};

思路分析

最长连续子序列变形

如果给你一个序列,求最长连续子序列,那么一次遍历就能得到

那么现在给你一个乱序的nums,并且允许你将某些数字加1,让你求最长连续子序列,又该如何呢?

首先我们将nums升序排序,然后注意到数组长度范围1e5而数据范围只有1e6,这是本题的关键

那么我们可以统计记录nums的最小值l和最大值r,然后记录每个数字出现次数cnt[x]

对于cnt[x]>1的数字,我们直接拿出一个变成x+1,因为这样只会让连续序列更长(注意维护r,因为这一点导致我没有AC,有几个样例没过QAQ)

然后我们一次遍历得到最长连续子序列即可,不过有所不同,我们注意到有一些cnt[x]=1的数字+1也是有可能让最长连续子序列变长的,所以求解步骤如下:

  • 枚举i,从l遍历到r,当前最长连续子序列长度为s,s的最长可操作后缀长度为pre
  • 如果i存在,那么s++,否则s = pre,pre=0(因为当前序列断了,我们把前面能右移的后缀拿过来)
  • 如果i在nums中存在并且未进行+1操作,那么pre++,否则pre=0
  • 维护ret即可

时间复杂度O(nlogn),空间复杂度O(n)

代码详解

class Solution
{
public:int cnt[1000005];int maxSelectedElements(vector<int> &nums){memset(cnt, 0, sizeof cnt);bitset<1000005> vis;unordered_set<int> mp(nums.begin(), nums.end());sort(nums.begin(), nums.end());int l = nums[0], r = nums.back(), ret = 1;for (auto x : nums)cnt[x]++;for (auto x : nums)if (cnt[x] > 1)cnt[x + 1]++, cnt[x]--, vis[x] = 1, r = max(r , x + 1);for (int i = l, pre = 0, s = 0; i <= r; i++){if(cnt[i])  s++;else{s = pre, pre = 0;continue;}if (mp.count(i) && !vis[i])    pre++;else    pre = 0;ret = max(ret , s);}return ret;}
};

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

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

相关文章

VScode中配置 C/C++ 环境 | IT拯救者

文章目录 0 引言1. 下载编辑器VScode2. 下载编译器MinGW并解压3. 将MinGW添加至环境变量4. 配置VScode插件5. 运行代码6. 调整和优化7. 提示8. 例行格式条款9. 例行格式条款 0 引言 由于VScode毛毛张使用不习惯&#xff0c;因此配置教程记不住&#xff0c;不过毛毛张看到一篇不…

接口测试总结及其用例设计方法

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

C语言----内存函数

内存函数主要用于动态分配和管理内存&#xff0c;它直接从指针的方位上进行操作&#xff0c;可以实现字节单位的操作。 其包含的头文件都是&#xff1a;string.h memcpy copy block of memory的缩写----拷贝内存块 格式&#xff1a; void *memcpy(void *dest, const void …

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠…

LeetCode JS专栏刷题笔记(一)

一、前言 LeetCode 在前不久出了一个 JavaScript 专栏&#xff0c;这个专栏一个目的是为了非前端工程师学习 JS&#xff0c;另一个是为了前端工程师提升 JS 能力。 因此在这个专栏中&#xff0c;基本不涉及什么具体算法问题&#xff0c;都是一些 JS 的入门语法与常见的 JS 面…

Android13 针对low memory killer内存调优

引入概念 在旧版本的安卓系统中&#xff0c;当触发lmk&#xff08;low memory killer&#xff09;的时候一般认为就是内存不足导致&#xff0c;但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小&#xff0c;io&#xff0c;cpu同样会做评判&#xff0c;从而保证设备…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

总结:Mybatis报错Invalid bound statement (not found)

目录 1、Mapper.xml中mapper namespace路径不准确 2、TextDao&#xff08;接口&#xff09;与TextMapper.xml id标签不一致 ​编辑 3、application.properties中配置mybatis.type-aliases-packagecom.demo.entity需要与Text实体类路径一致 4、pom.xml文件中需要配置<res…

adobe软件提示This non-genuine Adobe app will be disabled soon【软件版本】

因为电脑上级路由器装了小飞机&#xff0c;导致本机电脑ps等adobe的系列软件出现了 This non-genuine Adobe app will be disabled soon&#xff0c;烦人的狠&#xff0c;之前有写过一篇通过更改host的教程&#xff0c;现在已经失效了&#xff0c;今天为大家分享一个用软件来屏…

关于数据结构的定义以及基本的数据结构

在计算机科学中&#xff0c;数据结构是指用于组织和存储数据的方式或方法。它涉及到在计算机内存中存储、管理和操作数据的技术和原则。数据结构不仅仅是简单地存储数据&#xff0c;还可以提供高效的数据访问和操作方式&#xff0c;以满足特定的需求。 以下是每个数据结构的详细…

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 &#xff1a;sudo ./vmware-install.pl 执行不了可以放到家目录&#xff0c;我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…

个人简历补充

个人简历补充 1.对工作的认识2.八股文和知识面3.框架/架构角度深扒3.1 前端3.1.1 mPaaS&#xff08;移动领域&#xff09;3.1.2 普通前端项目框架3.1.3 微前端 3.2 后端 持续更新 1.对工作的认识 2.八股文和知识面 前端&#xff08;基础知识 / 开发能力 / 总结输出能力&#xf…

electron桌面开发相关注意点

electron的部署以及配置 如果使用的是pnpm&#xff0c;请先配置一下镜像&#xff0c;否则会安装失败的&#xff1a; pnpm config set registryhttps://registry.npmmirror.com pnpm config set electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ pnpm config set …

【Linux】进程间通信——共享内存

文章目录 共享内存的概要创建共享内存shmget()参数keyshmget()参数sizeshmget()参数shmflg 删除共享内存挂载共享内存去关联 共享内存的概要 共享内存允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。不同进程之间…

用阿里云一键部署了幻兽帕鲁服务器,怎么一键切换成雾锁王国服务器?

之前用阿里云一键部署的幻兽帕鲁服务器&#xff0c;现在不想玩了&#xff0c;想要换成雾锁王国服务器&#xff0c;该怎么操作呢&#xff1f; 操作方法如下&#xff1a; 首先打开你的阿里云计算巢&#xff0c;之前你买过的一键部署幻兽帕鲁服务实例&#xff0c;这里应该可以看…

Ansible的脚本 --- playbook 剧本

目录 playbook的简介 什么是playbook playbook组成 应用实例 Templates 模块 tags 模块 Roles 模块 playbook的简介 什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playboo…

Zig、C、Rust的Pk1

Zig、C、Rust的Pk1 github.com上看到“A basic comparitive analysis of C, C, Rust, and Zig.”&#xff1a;https://github.com/CoalNova/BasicCompare/tree/main 里边的代码是9个月之前的&#xff0c;用现在的zig 0.11.0 及0.12-dev都无法通过编译(具体为&#xff1a;zig-w…

【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 深度学习技术在无线通信领域的应用越来越广泛&#xff0c;特别是在非正交多址接入&#xff08;NOMA&#xff09;和正交频分复用&#xff08;OFDM&#xff09;系统中&#xff0c;深度学习技术被用来提高信道估计的性能和效率。…

【JavaEE】_CSS选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

Jmeter 分布式压测

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 结果分析 但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下面介…
推荐文章