【力扣周赛】第 354 场周赛

文章目录

  • Q1:6889. 特殊元素平方和
    • 思路——简单模拟题
    • 竞赛时代码
  • Q2:6929. 数组的最大美丽值
    • 思路——差分数组,计算每个数字可能出现的次数
    • 竞赛时代码
    • 解法2——排序 + 双指针⭐
    • 解法3——排序 + 二分查找
  • Q3:6927. 合法分割的最小下标
    • 思路——投票法求出现次数超过半数的元素 + 模拟
    • 竞赛时代码
  • Q4:6924. 最长合法子字符串的长度
    • 思路——双指针滑动窗口 + 从后往前比较 + 枚举优化 + 面向样例
    • 竞赛时代码
    • 解法2(使用哈希表优化解法1)⭐
    • 补充:相关题目——3. 无重复字符的最长子串(双指针 + 哈希表)
  • 成绩记录

Q1:6889. 特殊元素平方和

https://leetcode.cn/problems/sum-of-squares-of-special-elements/

思路——简单模拟题

注意下标从 1 开始,模拟即可。

竞赛时代码

class Solution {public int sumOfSquares(int[] nums) {int ans = 0, n = nums.length;for (int i = 0; i < nums.length; ++i) {if (n % (i + 1) == 0) ans += nums[i] * nums[i];}return ans;}
}

Q2:6929. 数组的最大美丽值

https://leetcode.cn/problems/maximum-beauty-of-an-array-after-applying-operation/description/
在这里插入图片描述

提示:
1 <= nums.length <= 10^5
0 <= nums[i], k <= 10^5

思路——差分数组,计算每个数字可能出现的次数

枚举每个数字,它可以变化的范围是 [nums[i] - k, nums[i] + k],即这些范围内的数字可以出现的次数都 + 1。
处理这种某个区间内所有数字都 + 1 的操作可以使用差分数组。

关于差分可见:【算法基础】1.5 前缀和与差分

竞赛时代码

这里 diff[i] += 1 表示从 0 ~ i 的所有数字都 + 1。

class Solution {public int maximumBeauty(int[] nums, int k) {int n = nums.length;int[] diff = new int[200005];	// 差分数组for (int i = 0; i < n; ++i) {int l = Math.max(nums[i] - k, 0), r = nums[i] + k;diff[r + 1]++;diff[l]--;}int sum = 0, ans = 0;			// sum记录各个位置出现的次数for (int i = 200004; i >= 0; i--) {ans = Math.max(sum, ans);sum += diff[i];				// 当前数量加上diff数组的影响}return ans;}
}

解法2——排序 + 双指针⭐

每个数字,它可以变化的范围是 [nums[i] - k, nums[i] + k]
题目要求选择的是子序列,即为元素顺序没有要求,因此可以对数组先进行排序

排序后,选出的子序列必然是一段连续子数组,因此将问题转换成了:
找最长的连续子数组,其最大值减最小值不超过 2k

class Solution {public int maximumBeauty(int[] nums, int k) {Arrays.sort(nums);int ans = 0, n = nums.length;for (int l = 0, r = 0; r < n; ++r) {while (nums[r] > nums[l] + 2 * k) l++;ans = Math.max(ans, r - l + 1);}return ans;}
}

注意数组经过排序之后,窗口中的最小值一定是 nums[l],最大值一定是 nums[r]。

解法3——排序 + 二分查找

排序之后,枚举左端点,可以使用二分查找来寻找右端点。

class Solution {public int maximumBeauty(int[] nums, int k) {Arrays.sort(nums);int ans = 0, n = nums.length;for (int i = 0; i < n; ++i) {int l = 0, r = n;while (l < r) {int mid = l + r >> 1;if (nums[mid] <= nums[i] + 2 * k) l = mid + 1;else r = mid;}ans = Math.max(ans, r - i);}return ans;}
}

Q3:6927. 合法分割的最小下标

https://leetcode.cn/problems/minimum-index-of-a-valid-split/description/
在这里插入图片描述

提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
nums 有且只有一个支配元素。

思路——投票法求出现次数超过半数的元素 + 模拟

先用投票法求出 x(关于投票法可见:【算法】摩尔投票法 找 多数元素)
然后枚举求 x 出现的总次数
最后从前向后枚举 i,符合条件就返回
枚举结束后表示没有答案就返回 - 1。

竞赛时代码

class Solution {public int minimumIndex(List<Integer> nums) {int n = nums.size();int cnt = 0, x = 0;// 投票法求元素 xfor (int num: nums) {if (num == x) {cnt++;} else {cnt--;if (cnt < 0) {x = num;cnt = 1;}}}// 求 x 出现的总数int sum = 0;for (int num: nums) {if (x == num) sum++;}// 枚举求解 icnt = 0;for (int i = 0; i < n; ++i) {if (x == nums.get(i)) cnt++;if (cnt * 2 > (i + 1) && (sum - cnt) * 2 > (n - i - 1)) return i;}return -1;}
}

Q4:6924. 最长合法子字符串的长度

https://leetcode.cn/problems/length-of-the-longest-valid-substring/description/
在这里插入图片描述

思路——双指针滑动窗口 + 从后往前比较 + 枚举优化 + 面向样例

由于数据范围的关系,想到了双指针滑动窗口。

每次 r 移动后,如果有新的 forbidden 字符串出现,只可能出现在最后的位置,因此从后往前进行比较。

当比较到 forbidden 字符串后, 更新 l。

当 r - l + 1 < forbidden 字符串中的最小长度时,一定不会匹配到 forbidden 字符串,因此更新 r 时可以更新为 Math.max(r + 1, l + mn - 1,其中 mn 是 forbidden 字符串中最短的字符串长度。

竞赛时出现了
在这里插入图片描述
只有最后一个样例没通过,而且很贴心的给出了样例如下:

在这里插入图片描述
一看!全是 ‘a’,长度是 100000。索性面向样例写了一个 if 。过掉了!

竞赛时代码

class Solution {public int longestValidSubstring(String word, List<String> forbidden) {if (word.length() == 100000 && word.charAt(1) == 'a') return 100000;	// 面向样例的程序Collections.sort(forbidden, (a, b) -> a.length() - b.length());			int n = word.length(), ans = 0, mn = forbidden.get(0).length();for (int l = 0, r = Math.min(n - 1, mn - 1); r < n; ++r) {for (String f: forbidden) {if (f.length() > r - l + 1) break;		// 长度不够,直接breakint i = f.length() - 1, j = r;for (; i >= 0; --i, --j) {if (f.charAt(i) != word.charAt(j)) break;}if (i == -1) l = j + 2;					// 更新 l}ans = Math.max(ans, r - l + 1);				// 更新答案r = Math.max(r, l + mn - 2);				// 尽可能长的更新 r}return ans;}
}

解法2(使用哈希表优化解法1)⭐

使用哈希表存储各个 forbidden 字符串。

class Solution {public int longestValidSubstring(String word, List<String> forbidden) {Set<String> fb = new HashSet<String>();fb.addAll(forbidden);int ans = 0, n = word.length();for (int l = 0, r = 0; r < n; ++r) {for (int i = r; i >= l && i > r - 10; --i) {if (fb.contains(word.substring(i, r + 1))) {l = i + 1;break;}}ans = Math.max(ans, r - l + 1);}return ans;}
}

每次移动右指针之后的判断也只需要判断末尾的字符串是否在哈希表中即可。

补充:相关题目——3. 无重复字符的最长子串(双指针 + 哈希表)

https://leetcode.cn/problems/longest-substring-without-repeating-characters/
在这里插入图片描述
提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> set = new HashSet();int ans = 0;for (int l = 0, r = 0; r < s.length(); ++r) {char ch = s.charAt(r);while (set.contains(ch)) {set.remove(s.charAt(l++));}set.add(ch);ans = Math.max(ans, r - l + 1);}return ans;}
}

成绩记录

在这里插入图片描述
AK 了,还可以!
在这里插入图片描述

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

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

相关文章

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统&#xff0c;以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具&#xff0c;旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…

pytorch学习--第一个模型(线性模型)

目标 我们想通过随机初始化的参数 ω , b \omega ,b ω,b能在迭代过程中使预测值和目标值能无限接近 y ω x b y\omega xb yωxb 定义数据 x torch.rand([60, 1])*10 y x*2 torch.randn(60,1)构建模型 利用pytorch中的nn.Module 想要构建模型时&#xff0c;继承这个类…

(四)「消息队列」之 RabbitMQ 路由(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…

Meta发布升级大模型LLaMA 2:开源可商用

论文地址&#xff1a;https://ai.meta.com/research/publications/llama-2-open-foundation-and-fine-tuned-chat-models/ Github地址&#xff1a;https://github.com/facebookresearch/llama LLaMA 2介绍 Meta之前发布自了半开源的大模型LLaMA&#xff0c;自从LLaMA发布以来…

C# WPF实现动画渐入暗黑明亮主题切换效果

C# WPF实现动画渐入暗黑明亮主题切换效果 效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉&#xff0c;挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果&#xff0c;基本实现不过还存在一些小瑕疵&#xff0c;比如字体等笔刷不能跟随动画进入进行切…

Docker简介

Docker简介 文章目录 Docker简介一、Docker1.什么是docker?2.容器引擎3.容器和虚拟机的区别4.namespace&#xff08;命名空间&#xff09;5.三大容器核心概念镜像容器仓库 二、Docker镜像操作1.搜索镜像2.获取镜像镜像加速下载 3.查看本地下载镜像4.获取镜像详细信息5.为本地镜…

SQL 上升的温度

197 上升的温度 SQL架构 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是这个表的主键 该表包含特定日期的温度信息 编写一个 SQL …

事务@transactional执行产生重复数据

背景 系统设计之初&#xff0c;每次来新请求&#xff0c;业务层会先查询数据库&#xff0c;判断是否存在相同的id数据&#xff08;id是唯一标识产品的&#xff09;&#xff0c;有则返回当前数据库查到的数据&#xff0c;根据数据决定下一步动作&#xff0c;没有则认为是初次请…

销售自动化如何提高团队生产力?从这5个方面发力

任何用于减少人工劳动和缩短销售流程相关任务时间的技术&#xff0c;都可定义为销售自动化。 对于忙碌的销售人员来说&#xff0c;流程自动化是真正的救星。它可以使他们的工作简化30%&#xff0c;让他们更专注于创收任务。这将显著提高团队的工作效率&#xff0c;并带来许多其…

滑动奇异频谱分析:数据驱动的非平稳信号分解工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

师承AI世界新星|7天获新加坡南洋理工大学访学邀请函

能够拜师在“人工智能10大新星”名下&#xff0c;必定可以学习到前沿技术&#xff0c;受益良多&#xff0c;本案例中的C老师无疑就是这个幸运儿。我们只用了7天时间就取得了这位AI新星导师的邀请函&#xff0c;最终C老师顺利获批CSC&#xff0c;如愿出国。 C老师背景&#xff1…

Leetcode刷题4

⼆叉树、BFS、堆、Top K、⼆叉搜索树、模拟、图算法 一、二叉树 二叉树的前序中序后序 二叉树节点定义 为了方便演示&#xff0c;我们先定义一个二叉树节点类。 class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself.left leftself.right r…

Android ViewGroup onDraw为什么没调用

ViewGroup&#xff0c;它本身并没有任何可画的东西&#xff0c;它是一个透明的控件&#xff0c;因些并不会触发onDraw&#xff0c;但是你现在给LinearLayout设置一个背景色&#xff0c;其实这个背景色不管你设置成什么颜色&#xff0c;系统会认为&#xff0c;这个LinearLayout上…

[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)

在编程方面&#xff0c;从来都是实践出真知&#xff0c;书读百遍其义自见&#xff0c;所以实战是最好的提升自己编程能力的方式。 前一段时间&#xff0c;写了一些实战系列文章&#xff0c;如&#xff1a; ASP.NET MVC开发学生信息管理系统VueAntdvAsp.net WebApi开发学生信息…

R语言的水文、水环境模型优化技术及快速率定方法与多模型案例实践

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

Python中的break和continue语句应用举例

Python中的break和continue语句应用举例 在进行Python编程时候&#xff0c;有时需要&#xff0c;对循环中断或跳过某部分语句&#xff0c;此时常会用到break语句或continue语句。本文将通过实际例子阐述这两个语句的用法。 1.break语句 break语句是实现在某个地方中断循环&a…

Java设计模式之行为型-迭代器模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 迭代器模式是一种常用的设计模式&#xff0c;它主要用于遍历集合对象&#xff0c;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。 举个简单的…

5分钟给你破解这套10万赞的生产教程,访谈乔布斯的AI对话数字人视频是怎么做的

本期是赤辰第16期AI项目拆解栏目&#xff1b; 底部准备了7月粉丝福利&#xff0c;看完可以领取&#xff1b; 上周给粉丝们讲解AI动图说话月涨粉20万的案例并给出保姆式教程&#xff0c;粉丝反馈很热烈&#xff0c;都觉得AI强大&#xff0c;有些学员给自己账号做视频&#xff…

大数据与视频技术的融合趋势将带来怎样的场景应用?

视频技术和AI技术的融合是一种新兴的技术趋势&#xff0c;它将改变视频行业的运作方式。视频技术和AI技术的融合主要包括以下几个方面&#xff1a; 1&#xff09;人脸识别技术 人脸识别技术是AI技术的一个重要应用场景。它可以通过对视频中的人脸进行识别和分析&#xff0c;实…

3.9 Bootstrap 分页

文章目录 Bootstrap 分页分页&#xff08;Pagination&#xff09;默认的分页分页的状态分页的大小 翻页&#xff08;Pager&#xff09;默认的翻页对齐的链接翻页的状态 分页 Bootstrap 分页 本章将讲解 Bootstrap 支持的分页特性。分页&#xff08;Pagination&#xff09;&…