Leetcode 第 375 场周赛题解

Leetcode 第 375 场周赛题解

  • Leetcode 第 375 场周赛题解
    • 题目1:2960. 统计已测试设备
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2961. 双模幂运算
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2962. 统计最大元素出现至少 K 次的子数组
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2963. 统计好分割方案的数目
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 375 场周赛题解

题目1:2960. 统计已测试设备

思路

按题意模拟即可。

代码

/** @lc app=leetcode.cn id=2960 lang=cpp** [2960] 统计已测试设备*/// @lc code=start
class Solution
{
public:int countTestedDevices(vector<int> &batteryPercentages){if (batteryPercentages.empty())return 0;int count = 0;for (int i = 0; i < batteryPercentages.size(); i++){if (batteryPercentages[i] > 0){count++;for (int j = i + 1; j < batteryPercentages.size(); j++)batteryPercentages[j] = max(0, batteryPercentages[j] - 1);}}return count;}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目2:2961. 双模幂运算

思路

快速幂。

带模运算的快速幂:

    long long myPow(long long x, int n, const int mod){long long res = 1;while (n){if (n % 2)res = res * x % mod;x = x * x % mod;n >>= 1;}return res;}

遍历数组 variables,设 a = variables[i][0]、b = variables[i][1]、c = variables[i][2]、m = variables[i][3],当满足 myPow(myPow(a, b, 10), c, m) == target 时,将下标 i 插入 goodIndices 中,最后返回数组 goodIndices。

代码

/** @lc app=leetcode.cn id=2961 lang=cpp** [2961] 双模幂运算*/// @lc code=start// 快速幂class Solution
{
public:vector<int> getGoodIndices(vector<vector<int>> &variables, int target){vector<int> goodIndices;for (int i = 0; i < variables.size(); i++){long long a = variables[i][0];int b = variables[i][1];int c = variables[i][2];int m = variables[i][3];if ((int)myPow(myPow(a, b, 10), c, m) == target)goodIndices.push_back(i);}return goodIndices;}// 辅函数 - 快速幂long long myPow(long long x, int n, const int mod){long long res = 1;while (n){if (n % 2)res = res * x % mod;x = x * x % mod;n >>= 1;}return res;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogU)其中 n 为数组 variables 的长度,U 为 bi 和 ci 的最大值, 本题为 103

空间复杂度:O(1)。

题目3:2962. 统计最大元素出现至少 K 次的子数组

思路

滑动窗口。

算法如下:

  1. 设 mx = max⁡(nums)。
  2. 右端点 right 从左到右遍历 nums。遍历到元素 x=nums[right] 时,如果 x=mx,就把计数器 count_mx 加一。
  3. 如果此时 count_mx>=k,则不断右移左指针 left,直到窗口内的 mx 的出现次数小于 k 为止。此时,对于右端点为 right 且左端点小于 left 的子数组,mx 的出现次数都至少为 k,把答案增加 left。

代码

/** @lc app=leetcode.cn id=2962 lang=cpp** [2962] 统计最大元素出现至少 K 次的子数组*/// @lc code=start// 滑动窗口class Solution
{
public:long long countSubarrays(vector<int> &nums, int k){int mx = *max_element(nums.begin(), nums.end());long long ans = 0;int count_mx = 0, left = 0;for (int right = 0; right < nums.size(); right++){if (nums[right] == mx)count_mx++;while (count_mx >= k){if (nums[left] == mx)count_mx--;left++;}// [0, right],...,[left-1, right] 是 mx 至少出现 k 次的子数组ans += left;}return ans;}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目4:2963. 统计好分割方案的数目

思路

合并区间。

考虑如下数组:[3,1,2,1,2,4,4],题目要求相同数字必须在同一个子数组中,所以两个 1 必须在同一个子数组,两个 2 也必须在同一个子数组。所以 [1,2,1,2] 这一段必须是完整的,不能分割。

把该数组分到无法再分,得到:[3]+[1,2,1,2]+[4,4],考虑每个 + 号选或不选,一共有 22=4 种好分割方案。

代码实现时,用一个哈希表/有序集合记录每个元素首次出现的位置和最后一次出现的位置,每个元素就对应着一个不可分割的区间。然后按照 56. 合并区间 的做法,把这些区间都合并起来。假设合并后的区间个数为 m,那么答案就是 2m-1 % (109 + 7)。

代码

/** @lc app=leetcode.cn id=2963 lang=cpp** [2963] 统计好分割方案的数目*/// @lc code=start
class Solution
{
private:static bool cmp(vector<int> &a, vector<int> &b){return a[0] < b[0];}public:int numberOfGoodPartitions(vector<int> &nums){// <num, pair<firstIndex, lastIndex>>unordered_map<int, pair<int, int>> positions;for (int i = 0; i < nums.size(); i++){int num = nums[i];auto it = positions.find(num);if (it != positions.end())it->second.second = i;elsepositions[num] = pair<int, int>(i, i);}// 合并区间vector<vector<int>> intervals;for (auto &[_, p] : positions)intervals.push_back({p.first, p.second});// 按区间左端点排序sort(intervals.begin(), intervals.end(), cmp);vector<vector<int>> merge;for (int i = 0; i < intervals.size(); i++){int left = intervals[i][0], right = intervals[i][1];if (merge.empty() || merge.back()[1] < left)merge.push_back(intervals[i]);elsemerge.back()[1] = max(merge.back()[1], right);}return (int)myPow(2, merge.size() - 1, 1e9 + 7);}// 辅函数 - 快速幂long long myPow(long long x, int n, const int mod){long long res = 1;while (n){if (n & 01)res = res * x % mod;x = x * x % mod;n >>= 1;}return res;}
};
// @lc code=end

复杂度分析

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

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

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

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

相关文章

小样本学习介绍(超详细)

小样本学习介绍 本文首先介绍了什么是小样本学习&#xff0c;其次介绍了为什么小样本学习的很多文章都采用元学习的方法。目的是通过通俗的解释更加清楚的介绍小样本学习是什么&#xff0c;适合初学者的入门。当然&#xff0c;以下更多的是自己的思考&#xff0c;欢迎交流。 …

莫比乌斯函数

积性函数定义 若gcd(p,q)1&#xff0c;有f(p*q)f(p)*f(q)&#xff0c;则f(x)是积性函数 其中规定f(1)1&#xff0c;对于积性函数有&#xff1a;所有的积性函数都可以用筛法求出 常见的积性函数有欧拉函数和莫比乌斯函数 筛法求莫比乌斯函数 const int N 1e9 5; const int …

K-均值聚类(K-means clustering)

K-均值聚类&#xff08;K-means clustering&#xff09;是一种常用的无监督学习算法&#xff0c;用于将样本数据划分成K个不同的类别。K-均值聚类试图找到K个簇&#xff0c;使得簇内的样本点相似度最高&#xff0c;而簇间的样本点相似度最低。 算法步骤如下&#xff1a; 随机…

用开源大语言模型开发的智能对话机器人初版原型验证

用开源大语言模型开发的智能对话机器人初版原型验证 0. 背景1. 初版检证效果展示2. 验证效果总结 0. 背景 同事要想做一个智能对话机器人&#xff0c;特别的需求有有些几点&#xff0c; 通过预置提示词&#xff08;包括确认事项&#xff09;&#xff0c;让大语言模型用会话式…

stream流做的那些事

假如一个学生类的list集合&#xff0c;返回50条数据&#xff1b;我只需要该集合中的学生姓名name字段&#xff0c;其他的字段都不想要&#xff0c;那么可以 String gender"男"; List<Student> students studentMapper.selectListByQuery(QueryWrapper.create…

技术学习|CDA level I 数据库应用(数据定义语言DDL)

用来对数据库管理系统中的对象进行增删改查的操作语言。 一、数据库 1、创建数据库 创建数据库是指在数据库管理系统的服务器中划分一个空间&#xff0c;用来存储相应的数据。在实际操作中&#xff0c;分析人员可以根据定期的需求分析对数据进行提取和归纳&#xff0c;并在当…

OpenAI ChatGPT-4开发笔记2024-02:Chat之text completion

API而已 大模型封装在库里&#xff0c;库放在服务器上&#xff0c;服务器放在微软的云上。我们能做的&#xff0c;仅仅是通过API这个小小的缝隙&#xff0c;窥探ai的奥妙。从程序员的角度而言&#xff0c;水平的高低&#xff0c;就体现在对openai的这几个api的理解程度上。 申…

【springboot+vue项目(零)】开发项目经验积累(处理问题)

一、VUEElement UI &#xff08;一&#xff09;elementui下拉框默认值不是对应中文问题 v-model绑定的值必须是字符串&#xff0c;才会显示默认选中对应中文&#xff0c;如果是数字&#xff0c;则显示数字&#xff0c;修改为&#xff1a; handleOpenAddDialog() {this.dialogT…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

SwiftUI之深入解析如何使用新地图框架MapKit

一、前言 一旦将 App 目标更新到 iOS 17&#xff0c;Xcode 会将任何使用旧的 Map 初始化器的用法标记为已弃用&#xff1a; 会有警告提示&#xff1a;init coordinate region 已在 iOS 17 中弃用。请改用带有 MapContentBuilder 参数的地图初始化器。在 iOS 17 中&#xff0c;…

2023新年总结与展望

2023年总结 对Spring Cloud微服务更加熟悉&#xff0c;对consul、kafka、gateway的熟悉和掌握更近一步对docker和虚拟化部署更加熟悉对PostgreSQL数据库和JPA更加熟悉对clickhouse数据库和大数据分析更加熟悉对netty和socket网络通信更加熟悉 2024年flag 继续深入研究和学习…

Java-replaceAll()同时替换多个字符

今天复现了raplaceAll&#xff08;&#xff09;的用法&#xff0c;但是通常都是对一种字符进行替换&#xff0c;我就在想有没有操作可以一次性替换多个不同的字符&#xff0c;百度一搜&#xff0c;果然有。具体情况如下 首先是替换字的 String str1 "小明&#xff0c;小…

案例091:基于微信小程序的农场驿站平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Redis (三)

1、redis复制 简单的概括就是主从复制&#xff0c;master以写为主&#xff0c;Slave以读为主&#xff0c;当master数据发生变化的时候&#xff0c;自动将更新的数据异步同步到其他的slave是数据库。 使用这种机制的话&#xff0c;可以做到读写分离&#xff0c;可以减轻主机负担…

[设计模式 Go实现] 行为型~迭代器模式

迭代器模式 送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。 可以使用送代器模式使遍历同时应用送代策略&#xff0c;如请求新对象、过滤、处理对象等。 iterator.go package iteratorimport "fmt"type Aggregate interface {Iterator(…

【华为数据之道学习笔记】10-3 摆脱传统手段的数据管理方式

智能数据管理是数据工作的未来 在以传统方式对数据实施管理和治理的过程中&#xff0c;数据工作者和业务方都需要投入相当多的人力和资源&#xff0c;才能达成管理目标&#xff0c;其中的艰辛&#xff0c;相信各位业内人士都深有体会。而随着智能大数据时代的到来&#xff0c;各…

# [NOIP2015 普及组] 扫雷游戏#洛谷

题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#…

14.两数之和

题目 class Solution {public int[] twoSum(int[] nums, int target) {int[] ret {-1,-1};for(int i0;i<nums.length;i) {for(int ji1;j<nums.length;j) {if(nums[i] nums[j] target) {ret[0] i;ret[1] j;}}}return ret;} }

uniapp 无限级树形结构面包屑、单选-多选、搜索、移除功能插件,基于【虚拟列表】高性能渲染海量数据,加入动态高度、缓冲区

hyq-tree-vtw 无限级树形结构面包屑、单选-多选、搜索、移除功能 示例项目 单选-user 单选-任意一项 多选-关联下级 多选-任意一项 已选择数据弹框 说明 本插件需要使用uni-popup、uni-transition用于已选择数据弹框&#xff0c;因此需要有这些依赖,请自行导入本插件基于【虚…