力扣第447场周赛

特性阻抗 – SI/PI 世界碰撞的地方 除了谐振零点和峰值外,在一定频率下,传输线的阻抗看起来像远端开路时的电容器的阻抗,也看起来像远端短路时电感的阻抗。如果随后的制造变化将测得的阻抗推到 -10% 容差的低端(例如 44 欧姆)的测量区域内,那么如果在初始下降时测量,则真正的特性阻抗将在 42 欧姆时降低 5%,并且超出规格。这意味着,当我们测量红色或蓝色图的峰和相邻谷之间的中间阻抗时,它是该频率下传输线的特性阻抗。图 7 远端开路时(红色常亮)与远端短路时(蓝色常亮)的电感和电容抗阻抗与频率的关系(上图)和传输线的阻抗与频率(下图)的对比。 阅读详情
AI摘要

博主参加力扣第447场周赛,赛时完成三题。内容包含四道题,分别是统计被覆盖的建筑、针对图的路径存在性查询I、判断连接可整除性、针对图的路径存在性查询II,给出了各题的数据范围、解题思路,部分题还给出代码实现思路,最后一题未完成。

这次终于赶上力扣的周赛了, 赛时成绩如下(依旧还是三题 ):

1. 统计被覆盖的建筑

给你一个正整数 n,表示一个 n x n 的城市,同时给定一个二维数组 buildings,其中 buildings[i] = [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。

如果一个建筑在四个方向(左、右、上、下)中每个方向上都至少存在一个建筑,则称该建筑 被覆盖 。

返回 被覆盖 的建筑数量。

数据范围如下:

  • 2 <= n <= 10^5
  • 1 <= buildings.length <= 10^5
  • buildings[i] = [x, y]
  • 1 <= x, y <= n
  • buildings 中所有坐标均 唯一 。

 解题思路:题目描述的是一个建筑,在上下左右四个方向只要有建筑就行(不一定相邻)

下面代码中提供了具体实现思路。

代码如下: 

class Solution {
public:
    int countCoveredBuildings(int n, vector<vector<int>>& buildings) {
        unordered_map<int,vector<int>> a,b;
        for(auto& v: buildings){
            int x=v[0]; int y=v[1];
            a[x].push_back(y);
            b[y].push_back(x);
        }
        for(auto& x:a){
            auto& va=x.second;
            sort(va.begin(),va.end());
        }
        for(auto& y:b){
            auto& va=y.second;
            sort(va.begin(),va.end());
        }
        int cnt=0;
        for(auto& v:buildings){
            int x=v[0]; int  y=v[1];
            auto& r=a[x];
            auto& c=b[y];
            auto itX=lower_bound(c.begin(),c.end(),x);
            bool l_one=(itX!=c.begin()); bool r_one=(next(itX)!=c.end());
            auto itY=lower_bound(r.begin(),r.end(),y);
            bool l_two=(itY!=r.begin()); bool r_two=(next(itY)!=r.end());
            if(l_one&&r_one&&l_two&&r_two) cnt++;  
        }
        return cnt;
    }
};
1. 统计x相等的  2. 统计y相等的
eg: [[1,2],[2,2],[3,2],[2,1],[2,3]]

x:
(1,2) 
(2,1) (2,2) (2,3)
(3,2)

y:
(2,3)
(1,2) (2,2) (3,2)
(2,1)

eg: (2,2) 检查(2,2)坐标的x左右侧和y的左右侧 x: (1,3) y: (1,3) 符合题意

2. 针对图的路径存在性查询 I

给你一个整数 n,表示图中的节点数量,这些节点按从 0 到 n - 1 编号。

同时给你一个长度为 n 的整数数组 nums,该数组按 非递减 顺序排序,以及一个整数 maxDiff。

如果满足 |nums[i] - nums[j]| <= maxDiff(即 nums[i] 和 nums[j] 的 绝对差 至多为 maxDiff),则节点 i 和节点 j 之间存在一条 无向边 。

此外,给你一个二维整数数组 queries。对于每个 queries[i] = [ui, vi],需要判断节点 ui 和 vi 之间是否存在路径。

返回一个布尔数组 answer,其中 answer[i] 等于 true 表示在第 i 个查询中节点 ui 和 vi 之间存在路径,否则为 false。

数据范围如下:

  • 1 <= n == nums.length <= 10^5
  • 0 <= nums[i] <= 10^5
  • nums 按 非递减 顺序排序。
  • 0 <= maxDiff <= 10^5
  • 1 <= queries.length <= 10^5
  • queries[i] == [ui, vi]
  • 0 <= ui, vi < n

解题思路:没啥好说的,直接套并查集模版就行(我前面的基础算法学习中提到了)

class DisjointSet {
    vector<int> fa; 
    vector<int> sz; 

public:
    int cc; 
    DisjointSet(int n) : fa(n), sz(n, 1), cc(n) {
        ranges::iota(fa, 0);
    }
    int find(int x) {
        if (fa[x] != x) {
            fa[x] = find(fa[x]);
        }
        return fa[x];
    }
    bool is_same(int x, int y){
        return find(x) == find(y);
    }
    bool Union(int from, int to) {
        int x = find(from), y = find(to);
        if (x == y) {
            return false;
        }
        fa[x] = y; 
        sz[y] += sz[x]; 
        cc--; 
        return true;
    }
    int get_size(int x) {
        return sz[find(x)];
    }
};
class Solution {
public:
    vector<bool> pathExistenceQueries(int n, vector<int>& nums, int maxDiff, vector<vector<int>>& queries) {
        DisjointSet a(n); 
        vector<bool> answer; sort(nums.begin(),nums.end());
        for(int i=1;i<nums.size();i++){
            if(nums[i]-nums[i-1]<=maxDiff){
                a.Union(i,i-1);
            }
        }
        for(auto& q:queries){
            int x=q[0]; int y=q[1];
            answer.push_back(a.find(x)==a.find(y));
        }
        return answer;
    }
};

判断节点i和节点j之间存在无向边
|nums[i]-nums[j]|<=maxDiff => 满足公式则存在无向边
然后给你个query查询,返回一个bool类型的answer数组

3.判断连接可整除性 

 给你一个正整数数组 nums 和一个正整数 k。

当 nums 的一个 排列 中的所有数字,按照排列顺序 连接其十进制表示 后形成的数可以 被 k  整除时,我们称该排列形成了一个 可整除连接 。

返回能够形成 可整除连接 且 字典序 最小 的排列(按整数列表的形式表示)。如果不存在这样的排列,返回一个空列表。

数据范围如下:

  • 1 <= nums.length <= 13
  • 1 <= nums[i] <= 105
  • 1 <= k <= 100

解题思路:如果是暴力全排列的话是O(n!),题目说的字典序数组,比较的是数组的数字

eg: [3,12,45]和[3,45,12], 前面的字典序更小

为了让字典序最小,我们要从小到大枚举。把 nums 从小到大排序,然后枚举第一个位置填nums[0],nums[1],nums[2]....nums[n-1], 一旦我们找到了答案(拼接的 n 个数模 k 等于 0),就立刻返回 true,不再继续递归搜索, 因为有重复的状态,所以我们要写一个记忆化数组。

递归入口:dfs(0, 0) 是从初始状态(无数字被使用,拼接为0)开始搜索,尝试找到一种数字排列,使得拼接后的数字能被 k 整除。如果找到,返回对应的排列(path);否则返回空列表。

递归出口:m==(1<<n)-1,  这是集合的二进制表示,指的是所有数字都被使用了

class Solution {
public:
    vector<int> concatenatedDivisibility(vector<int>& nums, int k) {
        int n=nums.size();
        sort(nums.begin(),nums.end());
        vector<int> len(n),pow_10_len(n);
        for(int i=0;i<n;i++){
            int x=nums[i];
            int t=x;
            while(t>0){
                len[i]++;
                t/=10;
            }
            int p=1;
            for(int j=0;j<len[i];j++){
                p=p*10;
            }
            pow_10_len[i]=p;
        }
        vector<vector<bool>> memo(1 << n, vector<bool>(k, false));
        vector<int> path;
        auto dfs = [&](this auto&& dfs,int m, int r) -> bool {
            if (m == (1 << n) - 1) {
                return r == 0;
            }
            if (memo[m][r]) return false;
            for (int i = 0; i < n; i++) {
                if (!(m & (1 << i))) {
                    int new_r = (r * pow_10_len[i] + nums[i] ) % k;
                    path.push_back(nums[i]);
                    if (dfs(m | (1 << i), new_r)) {
                        return true;
                    }
                    path.pop_back();
                }
            }
            memo[m][r] = true;
            return false;
        };
        if (dfs(0, 0)) {
            return path;
        }else {
            return {}; 
        }
    }
};

 4.针对图的路径存在性查询 II

 给你一个整数 n,表示图中的节点数量,这些节点按从 0 到 n - 1 编号。

同时给你一个长度为 n 的整数数组 nums,以及一个整数 maxDiff。

如果满足 |nums[i] - nums[j]| <= maxDiff(即 nums[i] 和 nums[j] 的 绝对差 至多为 maxDiff),则节点 i 和节点 j 之间存在一条 无向边 。

此外,给你一个二维整数数组 queries。对于每个 queries[i] = [ui, vi],找到节点 ui 和节点 vi 之间的 最短距离 。如果两节点之间不存在路径,则返回 -1。

返回一个数组 answer,其中 answer[i] 是第 i 个查询的结果。

注意:节点之间的边是无权重(unweighted)的。

感觉要用线段树优化,没写出来(还是太菜了) 

具体解法可以看这位佬的。

3534. 针对图的路径存在性查询 II - 力扣(LeetCode)

 感谢大家的点赞和关注,你们的支持是我创作的动力!

 

tree_sitter多语言解析器配置实战指南 本文是一份详细的Tree-sitter多语言解析器配置实战指南。文章从零开始,手把手指导如何搭建Python环境、安装指定版本的tree-sitter库、下载并编译多种语言的语法规则,最终构建一个统一的解析器库。通过实战代码演示了如何初始化解析器、解析代码并遍历语法树,旨在帮助开发者高效处理多语言代码分析任务,并分享了高级技巧与常见问题排坑经验。 阅读详情

相关推荐

SCCM实战指南:从零搭建企业级Windows自动化部署平台

本文提供了一份详细的SCCM实战指南,手把手教你从零搭建企业级Windows自动化部署平台。内容涵盖环境规划、AD架构扩展、SQL Server配置、SCCM主站点安装,以及最终实现操作系统镜像的自动化部署,旨在帮助IT管理员彻底告别手动装机,实现高效、规范的Windows设备批量管理。

weixin_29251337的博客 637

Leetcode 1617. 统计子树中城市之间最大距离

给你n个城市,编号为从1 到n。同时给你一个大小为n-1的数组edges,其中edges[i] = [ui, vi]表示城市ui和vi之间有一条双向边。题目保证任意城市之间只有唯一的一条路径。换句话说,所有城市形成了一棵树。 一棵子树是城市的一个子集,且子集中任意城市之间可以通过子集中的其他城市和边到达。两个子树被认为不一样的条件是至少有一个城市在其中一棵子树中存在,但在另一棵子树中不存在。 对于d从1 到n-1,请你找到城市间最大距离恰好为 d的所...

XY_xyz_xyz的博客 2225

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1048

算法习题-力扣447周赛题解

​ 经过思考,可以发现,如果有两种排列,他们选择的数字都一样,余数的结果也一样,那末,只需要遍历一种情况就好,而另一种情况和这一种的情况相同。​ 明白了字典序最小,就可以知道,如果刚开始排列的时候,我就是按照从字典序最小的开始排列,后面依次增大,那末,第一次遇到的能被。的特点,将符合要求的放在同一个集合中,最后遍历所有的询问,看看是否在同一个集合中即可。​ 由题意可知,需要把所给的数组,按照某一种特定的顺序重新排列后,所组成的拼接后的数字可以被。整除的排列,这样就可以节省一大部分的时间。

practice_warm的博客 940

逆向实战:基于内存态匿名段分析的 DexProtector 检测绕过策略

本文深入探讨了针对DexProtector加固方案的Frida检测绕过策略。通过分析运行时动态加载到匿名内存段的核心检测逻辑,提出了一套基于内存态分析、定位并转储匿名可执行段,进而通过精准Hook与“等式化替换”等技术实现稳定绕过的实战方法。该方法不仅适用于DexProtector,也对采用类似内存隐藏技术的加固方案具有参考价值。

ik678901的博客 512

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1019

Leetcode - 周赛447

leetcode - 周赛447,主要知识点:并查集,状压DP,排序+双指针+倍增

m0_74859835的博客 776

地震数据可视化必备:5分钟读懂SEGY道头字段全解析(含坐标定位指南)

本文深入解析了SEGY文件格式中道头坐标字段的提取与可视化方法。针对地震数据处理中的常见痛点,详细介绍了sx/sy、gx/gy等关键坐标字段的二进制解析、比例因子应用、单位转换及常见问题解决方案,并提供了实用的Python代码示例,帮助开发者实现从SEGY文件到三维空间可视化的完整流程。

echo99的专栏 1008

历次周赛、专场竞赛、春秋赛题目场次及对应具体题目题号+链接汇总

Warm Up Contest: 386.字典序排数 387.字符串中的第一个唯一字符 388.文件的最长绝对路径 Weekly Contest 2: 389. 找不同 390. 消除游戏 391. 完美矩形 Weekly Contest 3: 392. 判断子序列 393. UTF-8 编码验证 394. 字符串解码 395. 至少有 K 个重复字符的最长子串 Weekly Contest 4: 396. 旋转函数 397. 整数替换 398. 随机数索引 399. 除法求值 Weekly Contest

zhuruihe2014的博客 5313

项目篇 | 图书管理系统 | 管理员模块 | 概述

图书管理系统管理员模块概述

百栗.的博客 403

使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间

在泊松回归模型中,我们通常关注的是自变量对事件发生率的影响,而事件密度比(Incidence Rate Ratio,IRR)可以帮助我们理解不同自变量对事件发生率的相对影响。在本文中,我们将使用R语言来获取泊松回归模型所有系数的事件密度比的95%置信区间。通过以上步骤,我们可以使用R语言获取泊松回归模型所有系数的事件密度比的95%置信区间。为了获取事件密度比的置信区间,我们将使用。使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间。

BugCrusher的博客 1264

开一篇blog记录自己的周赛

开一篇blog记录自己的周赛 2020-07-05第196场周赛 第一次参赛 AC了1.2题 1407/5506 废物 2020-07-11第30场双周赛 AC了1.2.3题 第4题有点思路但没想到dp 875/2545 比fw好一点了 2020-07-12第197场周赛 AC了1.2题 3.4题代码写出来了但是有几个例子过不了(9/16和50/55) 好起来了 再接再厉 ...

qq_41027795的博客 236

基于深度学习的垃圾邮件识别

垃圾邮件的大量存在严重威胁着电子邮件系统的安全和效率。基于深度学习的垃圾邮件识别技术已经成为目前最有效的解决方案之一。本文将详细介绍使用深度学习技术进行垃圾邮件识别的方法,并提供相应的代码实现。 随着电子邮件的广泛应用,垃圾邮件的数量不断增加,传统的规则和统计方法已经无法满足对垃圾邮件进行准确识别的需求。深度学习技术以其强大的模式识别能力和自动特征提取能力成为解决垃圾邮件识别难题的有效工具。

一键难忘的博客 1093

2024年1月算法和数据结构学习日志

2023年1月决定将力扣作为自己学习算法和数据结构的长期平台。9月20日左右,决定记录下来自己解决力扣编程题的过程(多半是山路十八弯、秃头、白了少年头的过程,菜菜菜!!!这份学习日志争取做到以下三点(以上,完毕。

m0_62243101的博客 1204

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode Hot 100 链表专题 三· 3 题(Java)

收录题目:2. 两数相加、19. 删除链表的倒数第 N 个结点、24. 两两交换链表中的节点。 统一结构:① 题目分析与解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结。 贯穿三题的两条主线:虚拟头结点 dummy(统一处理头结点被修改的场景)与 指针修改顺序(避免断链、丢引用)。

2401_88612756的博客 481

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 174

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 197

LeetCode 1861. 旋转盒子|Go 双指针解法

j >= 0,如果写成j>0,会漏掉第 0 列,最左侧石头处理失败旋转矩阵行列互换:原 m 行 n 列 → 结果 n 行 m 列,make 数组长度不要写反旋转公式m-1-i:是原总行数 m,不是 n!很容易写成n-1-i区分:本题和轮转数组(189)分组循环不一样!189:所有元素固定移动 k 步,需要 gcd 分组1861:障碍物分割成多个独立段,石头向段末尾挤,用双指针更合适。

2503_92676540的博客 175

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 195

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 166

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 198

LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)

【LetMeFly】453.最小操作次数使数组元素相等:两次遍历(反向思维)

<font color="Pink">Tisfy的博客</font> 202

【算法学习笔记】LeetCode 15:三数之和(排序 + 双指针)

使用sort()对数组进行排序。理解排序后双指针的移动原理。使用外层循环固定一个数字。使用左右指针寻找另外两个数字。使用continue和while实现去重。理解的执行逻辑。将三层循环优化为排序 + 双指针,使时间复杂度从 O(n³) 降低到 O(n²)。

aqiu111111的博客 156

LeetCode100 15. 三数之和

本题通过排序+双指针优化三数之和。先对数组排序,外层遍历固定第一个数,内层用左右指针查找另两个数,使三数之和为0。通过剪枝(当前数>0则终止)和去重(跳过重复元素)提升效率。相比暴力或哈希法,该方法时间复杂度为O(n²),空间O(1),更高效优雅。

Shaoxingzong的博客 321

LeetCode hot 100 — 226. 翻转二叉树 | 101. 对称二叉树

自己稀里糊涂写了一版本居然还对了,我觉得我的思想就是很简单,这里就是要交换每一个节点的左右子树,所以套用了一下之前的中序遍历的迭代套路。一直在return False,但是没有给真正的正确答案一个出口(注意递归调用中出口 / 返回值很重要,或者说是最重要的)差一步美满....用的递归的写法,差一点点就满分了,先给出自己最开始写的代码。这道题的本质是对每一个节点执行相同的操作,并且交换哪个节点在先并不重要。你可以运用递归和迭代两种方法解决这个问题吗?,翻转这棵二叉树,并返回其根节点。给你一个二叉树的根节点。

Canmido的博客 128
上一篇: 牛客周赛 Round 91
下一篇: 力扣第448场周赛
一只鱼^_
博客等级 码龄3年 1073粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值