Leetcode 第 140 场双周赛题解

ops/2024/10/11 1:36:52/

Leetcode 第 140 场双周赛题解

  • Leetcode 第 140 场双周赛题解
    • 题目1:3300. 替换为数位和以后的最小元素
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3301. 高度互不相同的最大塔高和
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3302. 字典序最小的合法序列
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3303. 第一个几乎相等子字符串的下标
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 140 场双周赛题解

题目1:3300. 替换为数位和以后的最小元素

思路

遍历,维护数位之和的最小值。

代码

class Solution {
public:int minElement(vector<int>& nums) {int minElem = INT_MAX;for (int &num : nums)minElem = min(minElem, digitSum(num));return minElem;}// 辅函数 - 求数位之和int digitSum(int x){int sum = 0;while (x) {sum += x % 10;x /= 10;}return sum;}
};

复杂度分析

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

空间复杂度:O(1)。

题目2:3301. 高度互不相同的最大塔高和

思路

将数组 maximumHeight 从大到小排序。

使用一个变量 mx 表示当前能用的最大高度,初始化为 maximumHeight[0]。

遍历数组 maximumHeight,如果 maximumHeight[i] >= mx,基于贪心的思想,maximumHeight[i] 最多保留到 mx - 1,更新 mx = maximumHeight[i]。

因为题目要求 maximumHeight[i] 要是一个正整数,所以如果 mx <= 0,可以提前得知没有合法的设置,返回 -1。

代码

/** @lc app=leetcode.cn id=3301 lang=cpp** [3301] 高度互不相同的最大塔高和*/// @lc code=start
class Solution
{
public:long long maximumTotalSum(vector<int> &maximumHeight){sort(maximumHeight.begin(), maximumHeight.end(), greater<>());int mx = maximumHeight[0];for (int i = 1; i < maximumHeight.size(); i++){if (maximumHeight[i] >= mx)maximumHeight[i] = mx - 1;mx = maximumHeight[i];if (mx <= 0)return -1;}return accumulate(maximumHeight.begin(), maximumHeight.end(), 0LL);}
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目3:3302. 字典序最小的合法序列

思路

题解:https://leetcode.cn/problems/find-the-lexicographically-smallest-valid-sequence/solutions/2934051/qian-hou-zhui-fen-jie-zi-xu-lie-pi-pei-t-le8d/

代码

/** @lc app=leetcode.cn id=3302 lang=cpp** [3302] 字典序最小的合法序列*/// @lc code=start
class Solution
{
public:vector<int> validSequence(string word1, string word2){int n = word1.length(), m = word2.length();vector<int> suf(n + 1);suf[n] = m;for (int i = n - 1, j = m - 1; i >= 0; i--){if (j >= 0 && word1[i] == word2[j])j--;suf[i] = j + 1;}vector<int> ans(m);bool changed = false; // 是否修改过for (int i = 0, j = 0; i < n; i++){if (word1[i] == word2[j] || !changed && suf[i + 1] <= j + 1){if (word1[i] != word2[j])changed = true;ans[j++] = i;if (j == m)return ans;}}return {};}
};
// @lc code=end

复杂度分析

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

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

题目4:3303. 第一个几乎相等子字符串的下标

思路

现在变成了两个问题:

第一个问题:对于每个从 s[i] 开始的字符串 s[i…],计算它能匹配 pattern 多长的前缀。
第二个问题:对于每个以 s[j] 结尾的字符串 s[…j],计算它能匹配 pattern 多长的后缀。

在这里插入图片描述

代码

/** @lc app=leetcode.cn id=3303 lang=cpp** [3303] 第一个几乎相等子字符串的下标*/// @lc code=start
class Solution
{
public:int minStartingIndex(string s, string pattern){int n = s.length(), m = pattern.length();string rev_s = string(s.rbegin(), s.rend());string rev_pattern = string(pattern.rbegin(), pattern.rend());vector<int> preZ = getZ(pattern + s);vector<int> sufZ = getZ(rev_pattern + rev_s);reverse(sufZ.begin(), sufZ.end());for (int i = 0; i <= n - m; i++)if (preZ[i + m] + sufZ[i + m - 1] >= m - 1)return i;return -1;}// 辅函数vector<int> getZ(string s){int n = s.length();vector<int> z(n);int box_l = 0, box_r = 0; // z-box 左右边界for (int i = 1; i < n; i++){if (i <= box_r)z[i] = min(z[i - box_l], box_r - i + 1);while (i + z[i] < n && s[z[i]] == s[i + z[i]]){box_l = i;box_r = i + z[i];z[i]++;}}return z;}
};
// @lc code=end

复杂度分析

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

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


http://www.ppmy.cn/ops/123752.html

相关文章

【工具使用】使用Docsify搭建个人文档网站

检查Node.js安装状态 首先&#xff0c;打开命令提示符&#xff08;CMD&#xff09;&#xff0c;输入以下命令以验证Node.js是否已经安装在您的电脑上&#xff1a; node -v安装Docsify CLI工具 接下来&#xff0c;通过以下命令全局安装Docsify的命令行工具&#xff1a; npm …

【Qt】控件概述(4)—— 输出类控件

输出类控件 1. QLineEdit——单行输入框2. QTextEdit——多行输入框3. QComboBox——下拉框4. QSpinBox——微调框5. QDateEdit && QTimeEdit && QDateTimeEdit6 QDial——旋钮7. QSlider——滑动条 1. QLineEdit——单行输入框 QLineEdit是一个单行的输入框&…

Java之方法

方法&#xff08;函数&#xff09; Java中的方法必须定义在类或接口中。 package day2;import java.util.Scanner;public class way {public static void main(String[] args) {int arr[] new int[5];Scanner sc new Scanner(System.in);for (int i 0; i < arr.length;…

设计模式-解释器模式

解释器模式&#xff08;Interpreter&#xff09;:给定一种语言&#xff0c;定义它的文法表示&#xff0c;并定义一个解释器&#xff0c;该解释器用来根据文法表示来解释语言中的句子 解释器模式描述了如何构成一个简单的语言解释器&#xff0c;主要应用在使用面向对象语言开发的…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图&#xff0c;有 p p p 个关键点。你需要选择 k k k 个点染黑&#xff0c;使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

go和python打包项目对比

go源码 package mainimport ("fmt" )func main() {fmt.Println(" _____ _____ _____ _____")fmt.Println(" |2 ||2 ||2 ||2 |")fmt.Println(" | ^ || & || v || o |")fmt.Println(" | …

用Python制作数据可视化仪表盘:使用Dash与Plotly构建实时交互式仪表盘

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在数据驱动的世界中,可视化是理解和解释复杂数据的关键工具。通过数据可视化,用户能够快速洞察数据趋势,做出明智决策。而仪表盘作为一种高度集成的可视化工具,能够将多种数据图表汇总到一个界面上,便于实时…

如何评估显卡的硬件解码能力

拿到一张显卡之后&#xff0c;如何评估显卡的硬件解码能力&#xff0c;下面提供一种可以操作的方法供参考。 这里使用的操作系统是linux系统。 linux系统下面&#xff0c;通常用的硬件解码接口有VDPAU&#xff0c;VAAPI, OPENMAX。我们通过调用vaapi接口&#xff0c;来进行硬件…