Leetcode 第375场周赛,个人题解

文章目录

100143 统计已测试设备

题目描述

给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages ,表示 n 个设备的电池百分比。

你的任务是按照顺序测试每个设备 i,执行以下测试操作:

如果 batteryPercentagesi 大于 0:

增加 已测试设备的计数。

将下标在 i + 1, n - 1 的所有设备的电池百分比减少 1,确保它们的电池百分比 不会低于 0 ,即 batteryPercentagesj = max(0, batteryPercentagesj - 1)。

移动到下一个设备。

否则,移动到下一个设备而不执行任何测试。

返回一个整数,表示按顺序执行测试操作后 已测试设备 的数量。

思路分析

直接模拟

代码详解

cpp 复制代码
class Solution {
public:
    int countTestedDevices(vector<int>& batteryPercentages) {
        int n = batteryPercentages.size();
        batteryPercentages.emplace_back(0);
        int ret = 0 , sum = 0 , con = 0;

        for(int i = 0 ; i < n ; i++)
        {
            sum = batteryPercentages[i] + con;

            if(sum > 0){
                con -= 1;ret++;}
            
        }
        return ret;
    }
};

100155 双模幂运算

题目描述

给你一个下标从 0 开始的二维数组 variables ,其中 variablesi = ai, bi, ci, mi,以及一个整数 target 。

如果满足以下公式,则下标 i 是 好下标:

0 <= i < variables.length

((aibi % 10)ci) % mi == target

返回一个由 好下标 组成的数组,顺序不限 。

思路分析

一次遍历即可

代码详解

python直接一行就行

python 复制代码
class Solution:
    def getGoodIndices(self, variables: List[List[int]], target: int) -> List[int]:
        return [i for i in range(0 , len(variables)) if pow(pow(variables[i][0],variables[i][1])%10 , variables[i][2]) % variables[i][3] == target]

100137 统计最大元素出现至少 K 次的子数组

题目描述

给你一个整数数组 nums 和一个 正整数 k 。

请你统计有多少满足 「 nums 中的 最大 元素」至少出现 k 次的子数组,并返回满足这一条件的子数组的数目。

子数组是数组中的一个连续元素序列。

思路分析

前缀和统计出现次数,遍历前缀和数组pre,对于任何一个prei我们如果能找到一个最大的能满足prej <= prei - k的j

那么下标0到j都能满足要求

这一步可以用二分查找来做

其实就是一个二分板子题

代码详解

cpp 复制代码
class Solution {
public:
typedef long long ll;
    long long countSubarrays(vector<int>& nums, int k) {
        int ma = *max_element(nums.begin() , nums.end()) , n = nums.size();
        
        vector<ll> pre(n + 1);
        for(int i = 1 ; i <= n ; i++)
            pre[i] = pre[i - 1] + (nums[i - 1] >= ma);
        ll ret = 0;
        for(int i = 1 ; i <= n ; i++)
        {
            int j = upper_bound(pre.begin() , pre.begin() + i , pre[i] - k) - pre.begin();
            if(j > 0) ret += j;
        }
        return ret;
    }
};

100136 统计好分割方案的数目

题目描述

给你一个下标从 0 开始、由 正整数 组成的数组 nums。

将数组分割成一个或多个 连续 子数组,如果不存在包含了相同数字的两个子数组,则认为是一种 好分割方案 。

返回 nums 的 好分割方案 的 数目。

由于答案可能很大,请返回答案对 109 + 7 取余 的结果。

思路分析

一眼子数组动态规划问题,我们定义dpi为下标i为止的好分割数目,那么只需要想想状态怎么转移的就行

我们发现这些好分割出来的子数组没有交叉元素,所以我们可以先用一个哈希表hash1预处理出原数组的数字出现次数

然后再开另一个哈希表hash2边遍历边统计,我们记上一次好分割位置为i,当hash2中存在的元素的出现次数都跟hash1中相同时,不妨设这个位置为j,那么i到j就又是一个好子数组,那么dpj = dpi * 2

这个转移方程什么意思呢?就是我们新的子数组可以单独拿出来也可以和dpi个子数组的最右边拼接

显然这个方程可以滚动数组优化

然后记得对于第一个子数组特判即可

代码详解

cpp 复制代码
class Solution {
public:
const int MOD = 1e9+7;
typedef long long ll;
    int numberOfGoodPartitions(vector<int>& nums) {
        unordered_map<int , int> hash1 , hash2;
        for(auto x : nums) hash1[x]++;
        ll cur = 0 , pre = 0 , cnt = 0;
        for(auto x : nums)
        {
            cur = pre;
            if(++hash2[x] == hash1[x])
            {
                cnt++;
                if(cnt == hash2.size()){
                    if(!cur) cur = 1;
                    else{
                    cur = (pre * 2) % MOD;}pre = cur;
                }
            }
        }
        return cur;
    }
};
相关推荐
Raink老师1 天前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
Cosolar1 天前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
kkeeper~1 天前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6661 天前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964131 天前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚1 天前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov1 天前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫1 天前
特征工程处理
人工智能·算法·机器学习
秦明月131 天前
电芯装配测试线安全回路设计实战
经验分享·其他·职场和发展·创业创新·学习方法