Leetcode 第 368 场周赛题解

Leetcode 第 368 场周赛题解

  • Leetcode 第 368 场周赛题解
    • 题目1:2908. 元素和最小的山形三元组 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2909. 元素和最小的山形三元组 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2910. 合法分组的最少组数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2911. 得到 K 个半回文串的最少修改次数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 368 场周赛题解

题目1:2908. 元素和最小的山形三元组 I

思路

暴力枚举下标三元组 (i, j, k),更新答案 sum = min(sum, nums[i] + nums[j] + nums[k])。

代码

/*
 * @lc app=leetcode.cn id=2908 lang=cpp
 *
 * [2908] 元素和最小的山形三元组 I
 */

// @lc code=start
class Solution
{
public:
    int minimumSum(vector<int> &nums)
    {
        int n = nums.size();
        int sum = INT_MAX;
        for (int i = 0; i < n - 2; i++)
            for (int j = i + 1; j < n - 1; j++)
                for (int k = j + 1; k < n; k++)
                    if (nums[i] < nums[j] && nums[j] > nums[k])
                        sum = min(sum, nums[i] + nums[j] + nums[k]);
        return sum == INT_MAX ? -1 : sum;
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目2:2909. 元素和最小的山形三元组 II

思路

枚举 nums[j] + 前后缀分解。

定义 preMin[i] 为前缀最小值,初始化 preMin[0] = nums[0],递推公式:preMin[i] = min(preMin[i - 1], nums[i])

定义 sufMin[i] 为后缀最小值,初始化 sufMin[n - 1] = nums[n - 1],递推公式:sufMin[i] = min(sufMin[i + 1], nums[i])

枚举 nums[j],答案为 preMin[j - 1] + nums[j] + sufMin[j + 1] 的最小值。

代码

/*
 * @lc app=leetcode.cn id=2909 lang=cpp
 *
 * [2909] 元素和最小的山形三元组 II
 */

// @lc code=start
class Solution
{
public:
    int minimumSum(vector<int> &nums)
    {
        int n = nums.size();
        vector<int> preMin(n);
        preMin[0] = nums[0];
        for (int i = 1; i < n; i++)
            preMin[i] = min(preMin[i - 1], nums[i]);
        vector<int> sufMin(n);
        sufMin[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--)
            sufMin[i] = min(sufMin[i + 1], nums[i]);
        int minimumSum = INT_MAX;
        for (int j = 1; j < n - 1; j++)
            if (preMin[j - 1] < nums[j] && nums[j] > sufMin[j + 1])
                minimumSum = min(minimumSum, preMin[j - 1] + nums[j] + sufMin[j + 1]);
        return minimumSum == INT_MAX ? -1 : minimumSum;
    }
};
// @lc code=end

复杂度分析

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

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

题目3:2910. 合法分组的最少组数

思路

贪心。

统计每个数字的出现次数,记在哈希表 hash 中。

假设可以分成大小为 k 和 k+1 的组,现在需要算出对于每个数 num,每个 hash[num] 最少可以分成多少组。

设 q = freq / k,r = freq % k。

如果 q < r 则无法分成 k 和 k+1 组,否则一定可以分组。

在可以分组的前提下,分出的 k+1 越多,组数就越少,所以最少可以分出 ceil(freq / (k + 1)) 组。

累加组数即为分组个数。

从 min⁡(hash[num]) 开始倒着枚举 k,只要可以分,就立刻返回答案。

代码

/*
 * @lc app=leetcode.cn id=2910 lang=cpp
 *
 * [2910] 合法分组的最少组数
 */

// @lc code=start
class Solution
{
public:
    int minGroupsForValidAssignment(vector<int> &nums)
    {
        unordered_map<int, int> hash; // <value, frequency>
        for (const int &num : nums)
            hash[num]++;
        auto cmp = [](const auto &a, const auto &b) -> bool
        {
            return a.second < b.second;
        };
        int k = min_element(hash.begin(), hash.end(), cmp)->second;
        int ans = 0;
        for (;; k--)
        {
            for (auto &[num, freq] : hash)
            {
                int q = freq / k, r = freq % k;
                if (q < r)
                {
                    ans = 0;
                    break;
                }
                ans += ceil((double)freq / (k + 1));
            }
            if (ans)
                break;
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。设哈希表的大小为 m,哈希表中最小的 value 为 k,由于所有 value 之和为 n,所以 k * m ≤ n 。而循环次数又至多为 k * m,所以时间复杂度为 O(n)。

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

题目4:2911. 得到 K 个半回文串的最少修改次数

思路

题解:预处理+记忆化搜索/递推(附题单!)Python/Java/C++/Go

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=2911 lang=cpp
 *
 * [2911] 得到 K 个半回文串的最少修改次数
 */

// @lc code=start

// 预处理每个数的真因子,时间复杂度 O(MX * log(MX))
const int MX = 201;
vector<vector<int>> divisors(MX);
int init = []
{
    for (int i = 1; i < MX; i++)
        for (int j = i * 2; j < MX; j += i)
            divisors[j].push_back(i);
    return 0;
}();

class Solution
{
public:
    int minimumChanges(string s, int k)
    {
        int n = s.size();
        vector<vector<int>> modify(n - 1, vector<int>(n));
        for (int left = 0; left < n - 1; left++)
            for (int right = left + 1; right < n; right++)
            {
                string subStr = s.substr(left, right - left + 1);
                modify[left][right] = get_modify(subStr);
            }
        vector<vector<int>> memo(k, vector<int>(n, n + 1)); // n+1 表示没有计算过
        function<int(int, int)> dfs = [&](int i, int j) -> int
        {
            if (i == 0)
                return modify[0][j];
            int &res = memo[i][j]; // 注意这里是引用
            if (res <= n)
            { // 之前计算过
                return res;
            }
            for (int L = i * 2; L < j; L++)
                res = min(res, dfs(i - 1, L - 1) + modify[L][j]);
            return res;
        };
        return dfs(k - 1, n - 1);
    }
    // 辅函数 - 计算字符串 s 变成半回文串需要修改的字符数目
    int get_modify(string s)
    {
        int n = s.size(), res = n;
        for (int d : divisors[n])
        {
            int cnt = 0;
            for (int i0 = 0; i0 < d; i0++)
                for (int i = i0, j = n - d + i0; i < j; i += d, j -= d)
                    cnt += s[i] != s[j];
            res = min(res, cnt);
        }
        return res;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n3logn),其中 n 是字符串 s 的长度。时间主要在预处理上,有 O(n2) 个子串,平均每个子串有 O(logn) 个因子,每个因子需要 O(n) 的时间计算修改次数。

空间复杂度:O(n2),其中 n 是字符串 s 的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10 路由协议:西出网关无故人,敢问路在何方

1.网络包出了网关之后&#xff0c;就有了一种漂泊的悲凉感 2.之前的场景是比较简单的场景&#xff0c;但是在实际生产环境下&#xff0c;出了网关&#xff0c;会面临着很多路由器&#xff0c;有很多条道路可以选。 3、如何配置路由&#xff1f; 路由表的设计 1.路由器就是一…

基于GCC的工具objdump实现反汇编

一&#xff1a;objdump介绍 在 Linux中&#xff0c;一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成&#xff0c;但目标文件具有一种特殊的设计&#xff0c;提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…

Leetcode 第 369 场周赛题解

Leetcode 第 369 场周赛题解 Leetcode 第 369 场周赛题解题目1&#xff1a;2917. 找出数组中的 K-or 值思路代码复杂度分析 题目2&#xff1a;2918. 数组的最小相等和思路代码复杂度分析 题目3&#xff1a;2919. 使数组变美的最小增量运算数思路代码复杂度分析 题目4&#xff1…

Spring中Bean的生命周期

目录 Spring中Bean的生命周期容器中Bean对象创建流程BeanPostProcessor接口InstantiationAwareBeanPostProcessor接口DestructionAwareBeanPostProcessor接口 相关测试代码 Spring中Bean的生命周期 #mermaid-svg-3amPMFJe1D1hgKEY {font-family:"trebuchet ms",verda…

畜牧猪舍养殖成功 管理效率提高的背后原因

畜牧养猪远程监控方案 畜牧养猪物联网远程监控方案其目的是为了提高养猪场的管理效率&#xff0c;降低生产成本&#xff0c;提高猪肉质量和养殖安全。现有的方案通常包括传感器和无线网络设备&#xff0c;这些设备可以监测养猪场的温度、湿度、气体浓度、环境光照等指标&#…

招商银行余额截图生成器在线,虚拟金额中国农业邮政建设工商,易语言开源例子

其实用易语言的画板写一个图片生成器真的非常简单&#xff0c;我这里都没用任何第三方的支持库&#xff0c;当然也可以用EXUI画板自绘功能&#xff0c;但是用这个默认的就足够了&#xff0c;而且画出来的图非常高清&#xff0c;软件框架里面比较模糊因为缩放的原因&#xff0c;…

第一章:IDEA使用介绍

系列文章目录 文章目录 系列文章目录前言一、IDEA 的使用1.1 IDEA 工作界面1.2 IDEA 的基本介绍和使用1.3 IDEA 使用技巧和经验1.4 IDEA编译与源文件1.5 IDEA 常用快捷键1.6 IDEA模板/自定义模板 总结 前言 IDEA 全称 IntelliJ IDEA&#xff0c;在业界被公认为最好的 Java 开发…

PHP之getimagesize获取网络图片尺寸、类型信息

[0]&#xff1a;图像宽度&#xff08;以像素为单位&#xff09;[1]&#xff1a;图像高度&#xff08;以像素为单位&#xff09;[2]&#xff1a;图像类型的标识符[3]&#xff1a;包含字符串的属性&#xff0c;用于布局img元素&#xff08;例如&#xff1a;width"xxx" …

阿里巴巴国际站为什么凉了?数字一体化方案崛起!

随着全球化和数字化的浪潮不断涌现&#xff0c;跨境电商市场一直以惊人的速度增长。中国作为主要的出口和进口市场之一&#xff0c;成为跨境贸易的重要参与者。然而&#xff0c;近年来&#xff0c;阿里巴巴国际站似乎面临了一些挑战&#xff0c;同时数字一体化方案崭露头角&…

大口径智能水表支持最高水流量是多少?

随着科技的不断发展&#xff0c;我国城市化进程的加快&#xff0c;水资源管理日益受到重视。作为一种先进的用水计量设备&#xff0c;大口径智能水表凭借其高精度、低误差、远程抄表等优点&#xff0c;在市场上备受青睐。那么接下来&#xff0c;小编就来为大家详细的介绍一下大…

金蝶云星空下游单据的操作控制上游单据的状态转换开发方案

文章目录 金蝶云星空下游单据的操作控制上游单据的状态转换开发方案说明方案设计开发实现售后单增加变更状态反写规则反写状态&#xff1a;在保存配置了反写状态保存后删除&#xff0c;反写规则不生效&#xff0c;需要在删除操作配置插件根据关联关系进行反写生效操作&#xff…

第二证券:机构策略:大盘有望继续走出震荡攀升走势

3053点上方途径压力较为明显&#xff0c;短期内打破3053点上方途径需求量能的不断释放&#xff0c;周三两市成交量再度打破万亿&#xff0c;这为后市向上打破奠定了基础&#xff0c;短线大盘打破前期3053点上方途径难以一蹴即至&#xff0c;但先行目标科创100、国证2000现已光复…

欧莱雅SAP系统成功合并

欧莱雅集团是全球化妆品行业的大型企业。该集团分为四个部门&#xff1a;消费品&#xff08;欧莱雅巴黎、卡尼尔、美宝莲Jade&#xff09;、专业产品&#xff08;欧莱雅专业人士、卡诗、 Redken、 Matrix&#xff09;、欧莱雅奢侈品&#xff08;兰蔻、碧欧泉、赫莲娜、阿玛尼香…

URI 和 URL 的区别

URI包括URL和URN两个类别&#xff0c;URL是URI的子集&#xff0c;所以URL一定是URI&#xff0c;而URI不一定是URL URI Universal Resource Identifier 统一资源标志符&#xff0c;用来标识抽象或物理资源的一个紧凑字符串。 通过使用位置&#xff0c;名称或两者来标识Interne…

安卓TextView调整下划线颜色、与文本底部的距离

需要自定义view来实现&#xff0c;因为安卓的TextView没有提供设置颜色与间距的方法 实现效果 下划线颜色与文字不一样下划线距离文字底部的边界可调整但只能标记同一行的文字&#xff0c;也就是说下划线的start与end在同一行。还没多行的需求&#xff0c;有时间再说 packa…

css style、css color 转 UIColor

你能看过来&#xff0c;就说明这个问题很好玩&#xff01;IT开发是一个兴趣&#xff0c;更是一个挑战&#xff01;兴趣使你工作有热情。挑战使让你工作充满刺激拉满的状态&#xff01;我们日复一日年复一年的去撸代码&#xff0c;那些普普通通的功能代码&#xff0c;已经厌倦了…

2023_11_6 每日半小时 SQL 刷题

文章目录 1. 查询所有列题目描述SQL 语句编写 2. 查询多列题目描述SQL 语句编写 3. 查询结果去重题目描述SQL 语句编写 4. 查询结果限制返回行数题目描述SQL 语句编写 5. 将查询后的列重新命名题目描述SQL 语句编写 语法小总结 1. 查询所有列 题目链接&#xff1a;SQL1 查询所…

SpringCloud——服务注册——Eureka

1.Eureka概述 2.Eureka架构&#xff1a; Eureka中80服务要实现对8001和8002服务访问的负载均衡&#xff0c;需要在80服务的RestTemplate上面加LoadBalanced注解&#xff0c;默认采用的是轮询的策略。 3.Eureka自我保护 当一个EurekaClient注册进EurekaServer&#xff0c;Eurek…

每日一题 2258. 逃离火灾(手撕困难!!!)

火会扩散&#xff0c;但是我们可以看作火不会扩散到已经着火的格子&#xff0c;这样我们就可以记录每一个为草地的格子的着火时间在代码中&#xff0c;因为数字 2 已经表示墙了&#xff0c;所以我们把当时间为 0 时着火的格子在 gird 中的值设为 3&#xff0c;时间为 1 时着火的…

2023年开发语言和数据库排行

2023年开发语言和数据库排行 一、开发语言相关1. Python1.1 Python优点1.2 Python缺点1.3 Python应用领域 2. C 语言2.1 C 语言优点2.2 C 语言缺点2.3 C语言应用领域 3. Java3.1 Java 优点3.2 Java缺点3.3 Java应用场景 4. C4.1 C 优点4.2 C 缺点4.3 C 应用场景 5. C#5.1 C# 优…