Leetcode 第 392 场周赛题解

Leetcode 第 392 场周赛题解

  • Leetcode 第 392 场周赛题解
    • 题目1:3105. 最长的严格递增或递减子数组
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3106. 满足距离约束且字典序最小的字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3107. 使数组中位数等于 K 的最少操作数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3108. 带权图里旅途的最小代价
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 392 场周赛题解

题目1:3105. 最长的严格递增或递减子数组

思路

动态规划。

代码

/*
 * @lc app=leetcode.cn id=3105 lang=cpp
 *
 * [3105] 最长的严格递增或递减子数组
 */

// @lc code=start
class Solution
{
public:
    int longestMonotonicSubarray(vector<int> &nums)
    {
        int n = nums.size();
        vector<int> dp1(n, 1);
        vector<int> dp2(n, 1);
        for (int i = 1; i < n; i++)
        {
            if (nums[i] > nums[i - 1])
                dp1[i] = max(dp1[i - 1] + 1, dp1[i]);
            if (nums[i] < nums[i - 1])
                dp2[i] = max(dp2[i - 1] + 1, dp2[i]);
        }
        return max(*max_element(dp1.begin(), dp1.end()), *max_element(dp2.begin(), dp2.end()));
    }
};
// @lc code=end

复杂度分析

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

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

题目2:3106. 满足距离约束且字典序最小的字符串

思路

贪心。

为了使得修改后的字典序最小,我们从头开始遍历字符串 s,尽可能将当前字符 c 修改成 ‘a’。

我们定义一次操作为:将字符串 s 的一个字符 c 向前移动一位或向后移动一位。问题要求 distance(s, t) <= k,我们转化为:我们最多能进行 k 次上述操作。

因为字符 ‘a’ 到 ‘z’ 按循环顺序排列,所以字符 c 可以向左修改成 ‘a’,或者向右修改成 ‘a’:

  1. 向左修改,操作次数为:c - ‘a’。
  2. 向右修改,操作次数为:‘a’ + 26 - c。

我们当然是取其中的最小值作为我们的操作次数:minD = min(c - ‘a’, ‘a’ + 26 - c)。

算法:

遍历字符串 s,设当前字符为 c,它修改到 ‘a’ 的最小操作次数是 minD:

  • 如果 k>=minD,说明该字符能修改到 ‘a’,将 c 修改成 ‘a’,k -= minD。
  • 否则,为了修改后的字典序最小,我们将 c 向前移动 minD 位,将 c 修改成 c - minD,退出循环。

最后返回修改后的字符串 s。

代码

/*
 * @lc app=leetcode.cn id=3106 lang=cpp
 *
 * [3106] 满足距离约束且字典序最小的字符串
 */

// @lc code=start
class Solution
{
public:
    string getSmallestString(string s, int k)
    {
        // 特判
        if (k == 0)
            return s;

        for (char &c : s)
        {
            if (c == 'a')
                continue;
            int minD = min(c - 'a', 'a' + 26 - c);
            if (k >= minD)
            {
                c = 'a';
                k -= minD;
            }
            else
            {
                c -= k;
                break;
            }
        }
        return s;
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目3:3107. 使数组中位数等于 K 的最少操作数

思路

排序 + 贪心。

题目要我们求将 nums 中位数变为 k 所需要的最少操作次数。

首先将数组 nums 排序,看看现在的中位数 median 是多少。

操作次数分为 3 部分:

  1. 将 median 修改成 k:操作次数 = abs(median - k)。
  2. 将 median 之前的大于 k 的元素修改成 k,操作次数 = sum(nums[i] - k)。
  3. 将 median 之后的小于 k 的元素修改成 k,操作次数 = sum(k - nums[i])。

三者之和就是答案。

代码

/*
 * @lc app=leetcode.cn id=3107 lang=cpp
 *
 * [3107] 使数组中位数等于 K 的最少操作数
 */

// @lc code=start
class Solution
{
public:
    long long minOperationsToMakeMedianK(vector<int> &nums, int k)
    {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int median = nums[n / 2];
        // if (n % 2)
        //     median = nums[n / 2];
        // else
        //     median = max(nums[n / 2 - 1], nums[n / 2]);
        long long op = 0;
        op += abs(median - k);
        int i = n / 2 - 1;
        while (i >= 0 && nums[i] > k)
        {
            op += nums[i] - k;
            i--;
        }
        i = n / 2 + 1;
        while (i < n && nums[i] < k)
        {
            op += k - nums[i];
            i++;
        }
        return op;
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目4:3108. 带权图里旅途的最小代价

思路

题解:两种方法:DFS / 并查集(Python/Java/C++/Go)

代码

DFS:

/*
 * @lc app=leetcode.cn id=3108 lang=cpp
 *
 * [3108] 带权图里旅途的最小代价
 */

// @lc code=start
class Solution
{
    vector<vector<pair<int, int>>> g;
    vector<int> cc_and, ids;

    int dfs(int x)
    {
        ids[x] = cc_and.size(); // 记录每个点所在连通块的编号
        int and_ = -1;          // 全为 1,性质:-1 & x = x
        for (auto &[y, w] : g[x])
        {
            and_ &= w;
            if (ids[y] < 0) // 没有访问过
                and_ &= dfs(y);
        }
        return and_;
    }

public:
    vector<int> minimumCost(int n, vector<vector<int>> &edges, vector<vector<int>> &query)
    {
        g.resize(n);
        for (auto &edge : edges)
        {
            int x = edge[0], y = edge[1], w = edge[2];
            g[x].emplace_back(y, w);
            g[y].emplace_back(x, w);
        }

        ids.resize(n, -1); // 记录每个点所在连通块的编号
        for (int i = 0; i < n; i++)
        {
            if (ids[i] < 0) // 没有访问过
            {
                // 记录每个连通块的边权的 AND
                cc_and.push_back(dfs(i));
            }
        }

        vector<int> ans;
        ans.reserve(query.size()); // 预分配空间
        for (auto &q : query)
        {
            int s = q[0], t = q[1];
            if (s == t)
                ans.push_back(0);
            else
                ans.push_back(ids[s] != ids[t] ? -1 : cc_and[ids[s]]);
        }
        return ans;
    }
};
// @lc code=end

并查集:

class Solution {
    vector<int> fa, and_;

    int find(int x) {
        if (fa[x] != x) {
            fa[x] = find(fa[x]);
        }
        return fa[x];
    };

public:
    vector<int> minimumCost(int n, vector<vector<int>> &edges, vector<vector<int>> &query) {
        fa.resize(n);
        iota(fa.begin(), fa.end(), 0);
        and_.resize(n, -1);
        for (auto &e: edges) {
            int x = find(e[0]);
            int y = find(e[1]);
            and_[y] &= e[2];
            if (x != y) {
                and_[y] &= and_[x];
                fa[x] = y;
            }
        }

        vector<int> ans;
        ans.reserve(query.size()); // 预分配空间
        for (auto &q: query) {
            int s = q[0], t = q[1];
            ans.push_back(s == t ? 0 : find(s) != find(t) ? -1 : and_[find(s)]);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:O((n+m+q)logn),其中 n 是节点个数,m 是数组 edges 的长度,q 是数组 query 的长度。

空间复杂度:O(n),其中 n 是节点个数。

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

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

相关文章

linux-centos修改时区时间

修改时区为北京时间 先输入tzselect&#xff0c;输入5&#xff0c;再输入9&#xff0c;再输入1&#xff0c;最后再输入1就行了 修改系统时间和硬件时间 查看当前时间 命令date修改系统时间 命令date -s "2024-04-21 18:30:30"查看硬件时间 命令hwclock --show修改…

AIGC Chat GPT 用思维导图总结,数据分析所需要掌握的Excel知识

你还不会制作思维导图吗&#xff1f; 现在已经可以零门槛一键生成&#xff0c;只需跟AI说一句话&#xff0c;就能完成&#xff01;&#xff01;&#xff01; 生成一个思维导图&#xff0c;主题是数据分析师需要掌握的Excel知识&#xff0c;在新窗口生成思念导图。 AIGC ChatG…

ONES 功能上新|ONES Wiki 新功能一览

支持在 ONES Wiki 页面中使用分栏进行横向排版&#xff0c;丰富排版方式&#xff0c;帮助用户以更丰富的版式展示内容。 应用场景&#xff1a; 页面的布局对内容的阅读有很大的影响。当页面中有图文混排的需求时&#xff0c;可以通过分栏来组织页面结构&#xff0c;以更清晰、更…

倾囊相授,ChatGPT干货技巧全在这里!如果没有这个方法我不可能学好ChatGPT

ChatGPT虽然已经问世一年多&#xff0c;但不少朋友还处于刚接触的阶段。于是&#xff0c;我们特别梳理了一些常见问题&#xff0c;尝试着用通俗的语言解释清楚这些内容。 1. ChatGPT的官方网址 https://www.chatgpt.com 你只要Google搜索能打开&#xff0c;这个网址肯定能打开。…

2024年成都市“蓉贝”软件人才年度评估及资金支持申报对象内容、材料要求

一、申报对象 经2023年评估合格的第一批&#xff08;2019年评聘&#xff09;、第二批&#xff08;2020年评聘&#xff09;、第三批&#xff08;2021年评聘&#xff09;“蓉贝”软件人才&#xff0c;2022年评聘的第四批“蓉贝”软件人才。 二、评估内容 &#xff08;一&#…

java和python刷题的一些语法规则总结(未完成)

语法总结 Java篇1、代码补全2、编程题中常用头文件3、编程题常用的内置方法4、模版 Python篇1、2、编程题中常用的头文件3、编程题中常用的内置方法4、伪代码模版 去哪练习&#xff1f; 1、LeetCode上有个面试模拟 2、牛客公司真题&#xff08;ACM模式&#xff09; ⚠️ 笔试均…

AI-数学-高中-44导数的运算法则

原作者视频&#xff1a;【导数】【一数辞典】3导数的运算法则&#xff08;略难&#xff09;_哔哩哔哩_bilibili 三种求导表达方式一样的&#xff0c;中间的比较常用&#xff1a; 链式法则&#xff1a;从外向内&#xff1a;

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

JavaScript实现代码雨

一、功能描述 使用canvas实现一个代码雨的功能&#xff0c;炫一个~~~ 二、上码 html <canvas id"canvas"></canvas> js let canvas document.querySelector(canvas);let ctx canvas.getContext(2d);// screen.availWidth:可视区域的宽度canvas.width…

Blender游戏资产优化技巧

创建视频游戏资产既具有挑战性又富有回报。 经过一些研究并根据我的经验&#xff0c;这里有三个技巧可以帮助你使用 Blender 优化游戏资产。 在 Blender 中优化游戏资源的三种技术可以归结为拥有高效的 3D 模型拓扑、通过烘焙优化纹理&#xff0c;以及最后通过 Blender 节点的…

【Spring AI 来了】

spring官方已经有Spring AI 插件&#xff0c;每个程序员必定拥抱AI&#xff0c;也意味着不就以后AI的open API 会成为我们开发成的基础jdk。 下面的内容也是AI直接根据网址给我翻译的&#xff0c;连格式都是生成的。AI应用已经渗透到各行各业了&#xff0c;并且会改变我们每个…

【八股】Java基础、集合、JVM

面向对象三大特性 1 封装&#xff1a; 将 方法 和 属性 写到同一个类中&#xff0c;并将属性 私有化&#xff0c;生成 get set方法&#xff0c;外部访问属性需要通过get和set方法,内部可以直接访问属性&#xff0c;这样的一个类我们认为它完成了封装。 2 继承&#xff1a; 子…

神经网络手写数字识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计4077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

python安装pytorch@FreeBSD

先上结论&#xff0c;最后在conda下安装成功了&#xff01; PyTorch是一个开源的人工智能深度学习框架&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;基于Torch库开发并维护。PyTorch提供了一个高效、灵活且易于使用的工具集&#xff0c;用于构建和训练深…

Python-VBA函数之旅-iter函数

目录 一、iter函数的常见应用场景&#xff1a; 二、iter函数使用注意事项&#xff1a; 三、如何用好iter函数&#xff1f; 1、iter函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 …

AndroidStudio 新建工程的基本修改及事件添加

注&#xff1a;2022.3.1&#xff0c;新建Empty Activity默认是Kotlin&#xff0c;可以选择新建Empty View Activity&#xff0c;修改语言为JAVA 应用名称 修改应用名称 路径&#xff1a;res-values-strings.xml 是否显示应用名称 路径&#xff1a;res-values-themes.xml …

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

Educational Codeforces Round 164 (Rated for Div. 2) A-E

A. Painting the Ribbon 暴力模拟即可 #include <bits/stdc.h>using namespace std; const int N 2e5 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3; // int mod 998244353; const int maxv 4e6 5; // #define endl &…
最新文章