Leetcode 第 418 场周赛题解

news2024/10/6 20:23:46

Leetcode 第 418 场周赛题解

  • Leetcode 第 418 场周赛题解
    • 题目1:3309. 连接二进制表示可形成的最大数值
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3310. 移除可疑的方法
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3311. 构造符合图结构的二维矩阵
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3312. 查询排序后的最大公约数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 418 场周赛题解

题目1:3309. 连接二进制表示可形成的最大数值

思路

枚举 6 种连接情况,返回其中的最大值。

代码

class Solution {
public:
    int maxGoodNumber(vector<int>& nums) {
        int a = nums[0];
        int b = nums[1];
        int c = nums[2];
        return max({getNum(a, b, c), getNum(a, c, b), getNum(b, a, c),
                    getNum(b, c, a), getNum(c, a, b), getNum(c, b, a)});
    }
    // 辅函数 - 求 a、b、c 的连接数值
    int getNum(int a, int b, int c) {
        string s = trans(a) + trans(b) + trans(c);
        ranges::reverse(s);
        int res = 0;
        for (int i = 0; i < s.length(); i++)
            res += (s[i] - '0') * (int)pow(2, i);
        return res;
    }
    // 辅函数 - 转换成二进制表示
    string trans(int x) {
        string s;
        while (x) {
            s.insert(s.begin(), x % 2 + '0');
            x /= 2;
        }
        return s;
    }
};

复杂度分析

时间复杂度:O(logX),其中 X=127 是元素取值上限。

空间复杂度:O(1)。

题目2:3310. 移除可疑的方法

思路

从 k 开始深度优先搜索,标记所有可以访问到的点。题目把这些点叫做可疑方法。

遍历 invocations,如果发现从「非可疑方法」到「可疑方法」的边,则无法移除可疑方法,返回数组 [0,1,2,⋯,n−1]。

否则,可以移除所有可疑方法。把没有被标记为可疑方法的点加入答案。

代码

class Solution {
public:
    vector<int> remainingMethods(int n, int k,
                                 vector<vector<int>>& invocations) {
        vector<vector<int>> grid(n);
        // 建图
        for (vector<int>& invocation : invocations) {
            int from = invocation[0], to = invocation[1];
            grid[from].push_back(to);
        }

        vector<bool> suspicious(n, false); // 可疑方法

        function<void(int)> dfs = [&](int x) {
            suspicious[x] = true;
            for (int& y : grid[x])
                if (suspicious[y] == false)
                    dfs(y);
        };

        dfs(k);

        for (vector<int>& invocation : invocations) {
            int from = invocation[0], to = invocation[1];
            if (suspicious[from] == false && suspicious[to] == true) {
                // 有【非可疑方法】->【可疑方法】的边,无法移除可疑方法
                vector<int> ans(n);
                iota(ans.begin(), ans.end(), 0);
                return ans;
            }
        }

        // 移除所有可疑方法
        vector<int> ans;
        for (int i = 0; i < n; i++)
            if (suspicious[i] == false)
                ans.push_back(i);
        return ans;
    }
};

复杂度分析

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

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

题目3:3311. 构造符合图结构的二维矩阵

思路

题解:https://leetcode.cn/problems/construct-2d-grid-matching-graph-layout/solutions/2940423/gou-zao-fen-lei-tao-lun-by-tsreaper-qxqc/

代码

class Solution {
public:
    vector<vector<int>> constructGridLayout(int n, vector<vector<int>>& edges) {
        // 建图并记录节点度数
        vector<vector<int>> grid(n);
        vector<int> degree(n, 0);
        for (vector<int>& edge : edges) {
            grid[edge[0]].push_back(edge[1]);
            grid[edge[1]].push_back(edge[0]);
            degree[edge[0]]++;
            degree[edge[1]]++;
        }

        int minDegree = *min_element(degree.begin(), degree.end());
        int maxDegree = *max_element(degree.begin(), degree.end());

        // 先求出矩阵最左边一列
        vector<int> vec;
        if (minDegree == 1) {
            // 情况 1:一行的矩阵
            for (int i = 0; i < n; i++)
                if (degree[i] == 1) {
                    vec.push_back(i);
                    break;
                }
        } else {
            int S;
            for (int i = 0; i < n; i++)
                if (degree[i] == 2) {
                    S = i;
                    break;
                }
            vec.push_back(S);
            if (maxDegree <= 3) {
                // 情况 2:两行的矩阵
                vec.push_back(degree[grid[S][0]] == 2 ? grid[S][0]
                                                      : grid[S][1]);
            } else {
                // 情况 3:矩阵至少三行
                int now = grid[S][0], last = S;
                while (degree[now] != 2) {
                    vec.push_back(now);
                    for (int& fn : grid[now])
                        if (degree[fn] <= 3 && fn != last) {
                            last = now;
                            now = fn;
                            break;
                        }
                }
                vec.push_back(now);
            }
        }

        int row = vec.size(), col = n / row;
        vector<vector<int>> ans(row, vector<int>(col, 0));
        vector<bool> visited(n, false);
        for (int i = 0; i < row; i++) {
            ans[i][0] = vec[i];
            visited[vec[i]] = true;
        }
        // 每次枚举一列,找出每个元素还不在矩阵里的邻居放在右边
        for (int j = 0; j + 1 < col; j++)
            for (int i = 0; i < row; i++)
                for (int& fn : grid[ans[i][j]])
                    if (!visited[fn]) {
                        ans[i][j + 1] = fn;
                        visited[fn] = true;
                    }
        return ans;
    }
};

复杂度分析

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

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

题目4:3312. 查询排序后的最大公约数

思路

题解:https://leetcode.cn/problems/sorted-gcd-pair-queries/solutions/2940415/mei-ju-rong-chi-qian-zhui-he-er-fen-pyth-ujis/

代码

class Solution {
public:
    vector<int> gcdValues(vector<int>& nums, vector<long long>& queries) {
        int mx = *max_element(nums.begin(), nums.end());
        vector<int> cnt(mx + 1, 0);
        for (int& num : nums)
            cnt[num]++;

        vector<long long> cnt_gcd(mx + 1, 0);
        for (int i = mx; i > 0; i--) {
            int c = 0;
            for (int j = i; j <= mx; j += i) {
                c += cnt[j];
                // gcd 是 2i,3i,4i,... 的数对不能统计进来
                cnt_gcd[i] -= cnt_gcd[j];
            }
            // c 个数选 2 个,组成 c * (c - 1) / 2 个数对
            cnt_gcd[i] += (long long)c * (c - 1) / 2;
        }

        vector<long long> preSum(mx + 1);
        preSum[0] = cnt_gcd[0];
        for (int i = 1; i < preSum.size(); i++)
            preSum[i] = preSum[i - 1] + cnt_gcd[i];

        vector<int> ans(queries.size());
        for (int i = 0; i < queries.size(); i++)
            ans[i] = upper_bound(preSum.begin(), preSum.end(), queries[i]) - preSum.begin();
        
        return ans;
    }
};

复杂度分析

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

空间复杂度:O(U),其中 U=max(nums),返回值不计入。

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

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

相关文章

Pytorch基础:网络层

文章目录 1.卷积层-Convolution Layers1.1 1d/2d/3d卷积1.2卷积--nn.Conv2d1.3转置卷积(实现上采样) 2.池化层3.线性层—Linear Layer4.激活函数层—Activate Layer 1.卷积层-Convolution Layers 卷积运算:卷积运算在输入信号(图像)上滑动,相应位置上进行乘加. 卷积核:又称过滤…

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码

Linux高级编程_30_管道

文章目录 管道作用&#xff1a;分类&#xff1a; 前置知识&#xff1a;复制文件描述符dupdup2 【推荐使用】 无名管道概述&#xff1a; pipe函数实现&#xff1a; ps -A | grep bash 有名管道&#xff1a;实现有名管道的聊天无名管道与有名管道的区别? 管道 作用&#xff1a;…

小红书算法岗面试,竞争太激烈了

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

排版套料系统设计说明

先上效果图 项目地址 1.产品介绍 产品名称&#xff1a;StreamFit 智能排版套料系统 主要功能&#xff1a; 智能排版优化 功能描述&#xff1a;StreamFit 利用先进的算法技术&#xff0c;自动对各类材料&#xff08;如布料、金属板材、纸张等&#xff09;进行高效排版布局&am…

一次Mysql数据库活跃连接数高告警的排查方法

基础相关知识 在现代应用中&#xff0c;数据库的性能和稳定性直接影响到整个系统的运行情况。活跃连接数高的告警往往意味着数据库负载过重&#xff0c;可能会导致性能下降甚至服务不可用。 活跃连接数指的是当前与数据库建立连接并且处于活动状态的连接数量。 高活跃连接数…

阿里云百炼通义大模型接入流程,手把手教程

阿里云百炼通义大模型接入流程&#xff0c;即体验大模型、创建Agent应用和创建自训练大模型&#xff0c;阿里云百科aliyunbaike.com分享阿里云官网关于阿里云百炼通义大模型的接入流程&#xff1a; 阿里云百炼通义大模型接入流程 快速接入阿里云百炼通义大模型共分为三大步骤&a…

大模型客服的未来发展趋势

在当今数字化时代&#xff0c;大模型客服正以惊人的速度改变着客户服务的格局。随着技术的不断进步&#xff0c;大模型客服的未来发展趋势充满了无限可能。随着人工智能技术的快速发展&#xff0c;智能客服领域正迎来一场前所未有的变革。大模型客服作为其中的重要分支&#xf…

为什么营业执照显示经营异常

经营异常是怎么回事&#xff1f;是什么意思&#xff1f;1、年报未依照正常的时间公示或者某些要素没有公示;2、营业执照的地址与实际的地址不符&#xff0c;该地址联络不到人。经营异常不处理有什么后果&#xff1f;有什么影响&#xff1f;企业被列入工商异常一般会对公司的经营…

Maven的生命周期与依赖作用域介绍

说明&#xff1a;本文介绍Maven的生命周期&#xff0c;以及在pom.xml文件中每个依赖&#xff08;dependency标签内&#xff09;scope标签的内容。 Maven生命周期 在IDEA项目中&#xff0c;右侧边栏&#xff0c;点Maven&#xff0c;可以看到以下生命周期。 其中&#xff0c; c…

【AI知识点】偏差-方差权衡(Bias-Variance Tradeoff)

偏差-方差权衡&#xff08;Bias-Variance Tradeoff&#xff09; 是机器学习和统计学中的一个核心概念&#xff0c;描述了模型在训练数据和测试数据上的表现与模型复杂度之间的关系。它解释了为什么我们需要在模型复杂度和模型泛化能力之间做权衡&#xff0c;以避免模型出现欠拟…

数字化转型:企业竞争力提升的关键

在当今时代&#xff0c;数字化转型已成为企业发展的必然趋势。它不仅仅是技术的应用&#xff0c;更是一种战略思维的转变。 数字化转型的主要内容 1.业务流程数字化&#xff1a;通过引入信息技术&#xff0c;实现业务流程的自动化、智能化&#xff0c;提高业务流程的效率和准确…

科普篇 --- 什么是汽车中的API?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

第四节——从深层剖析指针(让你不再害怕指针)

文章目录 1. 字符指针变量剑指offer例题 2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化 3. ⼆维数组传参的本质代码实现 4. 函数指针变量4.1 函数指针变量的创建4.3 两段有趣的代码4.3.1 typedef 关键字 5. 函数指针数组的定义 1. 字符指针变量…

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

【C++差分数组】3224. 使差值相等的最少数组改动次数|1996

本文涉及知识点 C差分数组 LeetCode3224. 使差值相等的最少数组改动次数 给你一个长度为 n 的整数数组 nums &#xff0c;n 是 偶数 &#xff0c;同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中&#xff0c;你可以将数组中 任一 元素替换为 0 到 k 之间的 任一…

【目标检测】集装箱缺陷检测数据集1476张5类缺陷VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1476 标注数量(xml文件个数)&#xff1a;1476 标注数量(txt文件个数)&#xff1a;1476 标注…

什么是高斯积分,以及如何求它的值(error function)

文章目录 什么是高斯积分高斯积分与误差函数的关系求值证明过程技巧1 两个相互独立的积分的乘积转为双重积分技巧2 富比尼定理技巧3 坐标系转换总结 什么是高斯积分 高斯积分的公式如下&#xff1a; 高斯积分与误差函数的关系 参考wiki&#xff0c;误差函数的定义如下&…

Ajax和axios简单用法

Ajax Ajax&#xff08;Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML&#xff09;。 作用是&#xff1a; 数据交换&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况…

【汇编语言】寄存器(CPU工作原理)(一)—— 寄存器的基础知识及存储

文章目录 前言1. 寄存器2. 通用寄存器3. 字在寄存器中的存储结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底层工作原…