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 的长度。

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

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

相关文章

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性&#xff0c;点击高级系统设置&#xff0c;点…

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

深度学习之基于YoloV5的火灾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 火灾检测系统基于YoloV5的介绍 火灾检测是一项重要的安全任务&#xff0c;它旨在及时发现和报警火灾风险。基于深度…

Tomcat 9.0.x 源码编译

文章目录 一、克隆源码二、构建 Maven1&#xff09;在项目根目录中新建 pom.xml 文件2&#xff09;然后 Add Maven Projects 三、在目录中增加 home 目录四、增加启动配置五、其它问题1&#xff09;控制台乱码解决 2&#xff09;启动后访问 localhost:8080 报错解决 一、克隆源…

力扣每日一题 -- 2919. 使数组变美的最小增量运算数

//这题本质还是一个背包问题 //怎么去思考这个问题呢 //我最开始的思想是根据经验来看&#xff0c;最小增量运算数&#xff0c;并且使数组变美丽&#xff0c;那么就有点像编辑距离的问题 //但是我看了下时间复杂度&#xff0c;不能是n^2,那么再去仔细思…

如何使用Pyarmor保护你的Python脚本

目录 一、Pyarmor简介 二、使用Pyarmor保护Python脚本 1、安装Pyarmor 2、创建Pyarmor项目 3、添加Python脚本 4、配置执行环境 5、生成保护后的脚本 三、注意事项与未来发展 四、未来发展 五、总结 本文深入探讨了如何使用Pyarmor工具保护Python脚本。Pyarmor是一个…

OpenHarmony,奏响中国基础软件的“光辉岁月”

梦想需要多久的时间&#xff0c;多少血和泪&#xff0c;才能慢慢实现&#xff1f; 天地间任我展翅高飞&#xff0c;谁说那是天真的预言&#xff1f; 《光辉岁月》歌词中的这两个问题&#xff0c;恰好可以送给今天的中国基础软件事业。 曾几何时&#xff0c;我们认为中国基础软件…

前端框架Vue学习 ——(四)Axios

文章目录 Axios 介绍Axios 入门Vue项目中使用 Axios Axios 介绍 介绍: Axios 对原生的 Ajax 进行了封装&#xff0c;简化书写&#xff0c;快速开发。&#xff08;异步请求&#xff09; 官网: https://www.axios-http.cn/ 官网介绍&#xff1a;Axios 是一个基于 promise 网络请…

了解web3,什么是web3

Web3是指下一代互联网&#xff0c;它基于区块链技术&#xff0c;将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念&#xff0c;它包括了很多方面&#xff0c;如数字货币、去中心化应用、智能合约等等。听不懂且大多数人听到这个东西&#xff0c;直觉感觉就像骗子…

nacos配置中心docker部署、配置及 goLang 集成使用

为什么需要配置中心 平时我们写一个demo的时候&#xff0c;或者说一个单体的应用&#xff0c;都会有一个配置文件&#xff0c;不管是 json文件或者yaml文件&#xff0c;里面包含了redis,mysql,es等信息&#xff0c;如果我们修改了配置文件&#xff0c;往往我们需要重启&#x…

oracle-sql语句执行过程

客户端输入sql语句。 sql语句通过网络到达数据库实例。 服务器进程(server process)接收到sql语句。 sql – 解析成执行计划&#xff0c;然后sql才能执行。 会将sql和sql的执行计划缓存到共享池中。解析: 会消耗很多资源。 从数据库找数据&#xff0c;先从buffer cache中找&a…

npm install:sill idealTree buildDeps

执行npm install&#xff0c;卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…