Leetcode 第 397 场周赛题解

Leetcode 第 397 场周赛题解

  • Leetcode 第 397 场周赛题解
    • 题目1:3146. 两个字符串的排列差
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3148. 矩阵中的最大得分
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3149. 找出分数最低的排列
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 397 场周赛题解

题目1:3146. 两个字符串的排列差

思路

模拟。

因为每个字符串中的字符都不重复,所以用一个哈希表统计字符串 s 中字符和下标,再遍历字符串 t 计算每个字符在两个字符串中位置的绝对差值之和。

代码

class Solution
{
public:int findPermutationDifference(string s, string t){int n = s.length();int diff = 0;unordered_map<char, int> idx;for (int i = 0; i < n; i++)idx[s[i]] = i;for (int i = 0; i < n; i++)diff += abs(i - idx[t[i]]);return diff;}
};

复杂度分析

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

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

题目2:

思路

外层循环枚举魔法师序列的末端,内层循环从魔法师序列的末端开始,往前间隔 k 累加求和。

因为有些魔法师可能会给你负能量,所以每累加一次能量,就要更新答案的最大值。

最后返回答案。

代码

class Solution
{
public:int maximumEnergy(vector<int> &energy, int k){int n = energy.size();int ans = INT_MIN;for (int i = n - k; i < n; i++){int sum = 0;for (int j = i; j >= 0; j -= k){sum += energy[j];ans = max(ans, sum);}}return ans;}
};

复杂度分析

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

空间复杂度:O(1)。

题目3:3148. 矩阵中的最大得分

思路

动态规划。

设经过的方格为 c1, c2, ⋯ , ck,那么得分为 (c2−c1)+(c3−c2)+⋯+(ck−ck−1)=ck−c1,也就是说得分只和路径上第一个方格以及最后一个方格有关。

因此问题变为:给一个矩阵,每次可以往右或往下走,求终点值-起点值的最大值。

设 dp[i][j] 表示以 (i,j) 为终点,起点的最小值,它显然是 dp[i - 1][j]、dp[i][j - 1]、grid[i][j] 三者的最小值,转移方程为:dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), grid[i][j])。

遍历 grid,每次先求以 (i,j) 为终点,起点的最小值 minGrid = min(dp[i - 1][j], dp[i][j - 1]),然后计算终点值-起点值的最大值 ans = max(ans, grid[i][j] - minGrid),最后更新 dp[i][j] = min(grid[i][j], minGrid)。

最后返回 ans。

代码

/** @lc app=leetcode.cn id=3148 lang=cpp** [3148] 矩阵中的最大得分*/// @lc code=start
class Solution
{
public:int maxScore(vector<vector<int>> &grid){int m = grid.size(), n = m ? grid[0].size() : 0;// dp[i][j] 表示以 (i,j) 为终点,起点的最小值int dp[m][n];memset(dp, INT_MAX, sizeof(dp));int ans = INT_MIN;// 状态转移for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){int minGrid = INT_MAX;if (i > 0)minGrid = min(minGrid, dp[i - 1][j]);if (j > 0)minGrid = min(minGrid, dp[i][j - 1]);ans = max(ans, grid[i][j] - minGrid);dp[i][j] = min(grid[i][j], minGrid);}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m*n),其中 m 和 n 分别是矩阵 grid 的行数和列数。

空间复杂度:O(m*n),其中 m 和 n 分别是矩阵 grid 的行数和列数。

题目4:3149. 找出分数最低的排列

思路

状压 DP。

题解:状压 DP:从记忆化搜索到递推(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=3149 lang=cpp** [3149] 找出分数最低的排列*/// @lc code=start
class Solution
{
public:vector<int> findPermutation(vector<int> &nums){int n = nums.size();vector<vector<int>> memo(1 << n, vector<int>(n, -1)); // -1 表示没有计算过// s 表示前面已选的下标集合,j 表示上一个位置的下标function<int(int, int)> dfs = [&](int s, int j) -> int{if (s == (1 << n) - 1){ // 所有位置都填完了,最后一个位置是下标 jreturn abs(j - nums[0]);}int &res = memo[s][j]; // 注意这里是引用if (res != -1){ // 之前计算过return res;}res = INT_MAX;// 枚举当前位置填下标 kfor (int k = 1; k < n; k++){if ((s >> k & 1) == 0){ // k 之前没填过res = min(res, dfs(s | 1 << k, k) + abs(j - nums[k]));}}return res;};vector<int> ans;// 找到最佳路径function<void(int, int)> make_ans = [&](int s, int j) -> void{ans.push_back(j);if (s == (1 << n) - 1)return;int final_res = dfs(s, j);for (int k = 1; k < n; k++){if ((s >> k & 1) == 1){ // k 之前填过continue;}if (dfs(s | 1 << k, k) + abs(j - nums[k]) == final_res){make_ans(s | 1 << k, k);break;}}};make_ans(1, 0);return ans;}
};
// @lc code=end

复杂度分析

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

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

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

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

相关文章

“论软件的可靠性评价”必过范文,突击2024软考高项论文

论文部分 摘要 2023年03月&#xff0c;我参与了某艺术品公司线上拍卖管理平台的研发。该项目的目标是建立一个互联网在线拍卖平台&#xff0c;用户可以通过手机或PC浏览器进入拍卖平台&#xff0c;对喜欢的拍品进行参拍出价。平台提供了在线支付、在线出价、保证金管理、拍品…

php fpdf使用记录

使用composer安装fpdf > composer require setasign/fpdf简单创建一个pdf文件并输出下载 //fpdf版本&#xff1a;&quot;setasign/fpdf&quot;: &quot;^1.8&quot;, // 创建PDF实例 $pdf new \FPDF();// 设置文档信息 $pdf->SetAuthor(Your Name); $pdf-…

深入解析力扣171题:Excel表列序号(进制转换法详解及模拟面试问答)

在本篇文章中&#xff0c;我们将详细解读力扣第171题“Excel表列序号”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&#xff0c;以便于理解。 问题描述…

Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) 路径frameworks/base/cmds/bootanimation/bootanimation_main.cpp init进程把我们的BootAnimation的二进制文件拉起来了&#xf…

iOS开发中的sceneDidEnterBackground和applicationDidEnterBackground

在 iOS 应用开发中&#xff0c;sceneDidEnterBackground 和 applicationDidEnterBackground 是两个不同的生命周期方法&#xff0c;它们分别属于 UISceneDelegate 和 UIApplicationDelegate&#xff0c;用于处理应用程序或场景进入后台时的逻辑。以下是它们的区别和用法&#x…

字符串和字节串

字符串和字节串 在 Python 中,字符串(String)和字节串(Byte String)是两种不同的数据类型。 字符串(String) 字符串是一种文本数据类型,它可以包含 Unicode 字符。Python 的字符串是使用 Unicode 编码的,可以包含任何语言的字符。 例如: s = "hello" …

YOLOv5改进 | 添加注意力篇 | 利用YOLOv10提出的PSA注意力机制助力YOLOv5有效涨点(附代码 + 详细修改教程)

一、本文介绍 本文给大家带来的改进机制是YOLOv10提出的PSA注意力机制&#xff0c;自注意力在各种视觉任务中得到了广泛应用&#xff0c;因为它具有显著的全局建模能力。然而&#xff0c;自注意力机制表现出较高的计算复杂度和内存占用。为了解决这个问题&#xff0c;鉴于注意…

一个可以自动生成随机区组试验的excel VBA小程序

在作物品种区域试验时&#xff0c;通常会采用随机区组试验设计&#xff0c;特制作了一个可以自动生成随机区组试验的小程序。excel参数界面如下&#xff1a; 参数含义如下&#xff1a; 1、生成新表的名称&#xff1a;程序将新建表格&#xff0c;用于生成随机区组试验。若此处为…

2024年3月电子学会Python编程等级考试(四级)真题题库

2024年3月青少年软件编程Python等级考试&#xff08;四级&#xff09;真题试卷 题目总数&#xff1a;38 总分数&#xff1a;100 选择题 第 1 题 单选题 运行如下Python代码&#xff0c;若输入整数3&#xff0c;则最终输出的结果为&#xff1f;&#xff08; &#xff…

java动态获取实体类字段的方法

1.使用反射&#xff08;Reflection&#xff09;API来动态地获取实体类的字段 在Java中&#xff0c;我们可以使用反射&#xff08;Reflection&#xff09;API来动态地获取实体类的字段。以下是一个详细的代码示例&#xff0c;演示了如何获取一个实体类的所有字段&#xff1a; …

arm cortex-m架构 SVC指令详解以及其在freertos的应用

1. 前置知识 本文基于arm cortex-m架构描述&#xff0c; 关于arm cortex-m的一些基础知识可以参考我另外几篇文章&#xff1a; arm cortex-m 架构简述arm异常处理分析c语言函数调用规范-基于arm 分析 2 SVC指令 2.1 SVC指令位域表示 bit15 - bit12&#xff1a;条件码&#…

SOFA-RPC学习记录

文章目录 需求分析模块划分微服务模块交互模块 可拓展架构插件机制 功能分析交互模块 学习微服务模块交互模块 dubbo与nacos集成学习Nacos配置中心实战 dubbo与apollo集成学习配置中心组件与k8s的抉择参考资料 结论 本报告旨在深入学习SOFA-RPC框架&#xff0c;特别是其动态配置…

LeetCode 每日一题 2024/5/27-2024/6/2

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/27 2028. 找出缺失的观测数据5/28 2951. 找出峰值5/29 2981. 找出出现至少三次的最长特殊子字符串 I5/30 2982. 找出出现至少三次的最长特殊子字符串 II5/31 2965. 找出缺…

Linux综合实践(Ubuntu)

目录 一、配置任务 1.1 配置该服务器的软件源为中科大软件源 1.2 安装相关软件openssh-server和vim 1.3 设置双网卡&#xff0c;网卡1为NAT模式&#xff0c;网卡2为桥接模式(桥接模式下&#xff0c;使用静态ip&#xff0c;该网卡数据跟实验室主机网络设置相似&#xff0c;除…

如何搜索[仅有1个文件]或[指定个数范围、名称、类型文件等复杂情况]的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到批量复制板块&#xff0c;用Ctrl5可以快速切换 然后鼠标移动到工具的贴边的右侧&#xff0c;不是移出工具外面&#xff0c;还在…

【赠书第22期】AI绘画全面精通

文章目录 前言 1 AI绘画基础知识 2 AI绘画技术应用 2.1 风格迁移 2.2 自动绘画 2.3 辅助绘画 3 AI绘画发展前景 3.1 艺术创作领域的变革 3.2 跨领域融合与创新 3.3 个性化艺术创作的普及 4 结语 5 推荐图书 6 粉丝福利 前言 随着科技的飞速发展&#xff0c;人工智…

自学 Java 怎么入门?

关于自学 Java 如何入门这一重要课题&#xff0c;在此为大家进行详细阐述。 在此之前&#xff0c;如果大家有兴趣的话&#xff0c;可以看看我自己精心整理的嵌入式入门资料&#xff0c;这些资料将全部免费送给大家。其中包含了编程教学内容、详细的视频讲解、实用的数据库资料…

锅炉智能制造工厂工业物联数字孪生平台,推进制造业数字化转型

在制造业快速发展的今天&#xff0c;数字化转型已经成为企业提升竞争力的关键途径。锅炉智能制造工厂工业物联数字孪生平台&#xff0c;作为一种创新的技术解决方案&#xff0c;正以其独特的优势&#xff0c;为制造业的数字化转型提供强大动力。锅炉智能制造工厂工业物联数字孪…

libevent源码跨平台编译(windows/macos/linux)

1.windows编译: 克隆: git clone https://github.com/libevent/libevent.git 克隆成功 生成makefile 生成成功 默认不支持OpenSSL,MbedTLS,ZLIB这三个库 编译: cmake --build . --config release