AcWing 48. 复杂链表的复刻(地址映射+原地复刻)

opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取) OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。: 首先,加载目标图像和要匹配的模板图像。: 选择适当的匹配方法,例如 cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED。每种方法对应不同的匹配计算方式。 阅读详情

1.地址映射

考虑将原链表的各个结点从头到尾依次进行编号。这样结点之间的指向关系就可以用编号来代替。在按一般链表的顺序复制好链表以后,就可以用编号的指向关系快速地定位每个新结点的额外指针的指向。这里为了方便对复制的链表进行编号,可以考虑用向量来依次存放每个新结点。至于原链表的结点与编号的关系可以考虑建立一个从结点地址到数字的映射关系。

具体代码如下:

/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     ListNode *next, *random;
 *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        unordered_map<ListNode *, int> node_to_num; //结点地址到编号的映射
        vector<ListNode *> num_to_node; //结点编号到地址的映射
        ListNode *p = head;
        int i = 0;
        while(p){
            node_to_num[p] = i++; //建立结点地址到编号的映射
            num_to_node.push_back(new ListNode(p -> val)); //建立结点编号到地址的映射
            p = p -> next;
        }
        num_to_node.push_back(NULL);
        p = head;
        i = 0;
        while(p){
            num_to_node[i] -> next = num_to_node[i + 1]; //顺序连接各个结点
            if(p -> random){ //若随机指针存在则根据映射关系进行连接
                int pos = node_to_num[p -> random];
                num_to_node[i] -> random = num_to_node[pos];
            }
            p = p -> next;
            i++;
        }
        return num_to_node[0];
    }
};

2.原地复刻

建立地址映射是一个比较容易想到和理解的方法。不过这个方法的缺点也比较明显。那就是要消耗额外的空间。这里原地复刻的方法除了新建结点以外不会消耗多余的空间。

此算法的原理是:对于一个链表A->B->C,将每个结点后都生成一个该结点的复制并按顺序连接。也就是说变成A->A`->B->B`->C->C`。然后根据原链表额外结点的指向关系可以很容易地使其后面的复制结点同样定位到对应的新的复制结点当中。最后将整个链表拆分成两个数据域和指针域相同的两个链表即可。

具体代码如下:

/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     ListNode *next, *random;
 *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        if(!head) return NULL;
        ListNode *p = head, *q = NULL;
        while(p){ //复制每一个结点并将其连接到原结点之后
            ListNode *clone = new ListNode(p -> val);
            clone -> next = p -> next;
            p -> next = clone;
            p = p -> next -> next;
        }
        p = head, q = head -> next;
        while(1){ //连接random指针
            if(p -> random) q -> random = p -> random -> next;
            p = p -> next -> next;
            if(!p) break;
            q = q -> next -> next;
        }
        ListNode *clone_head = head -> next;
        p = head, q = clone_head;
        while(1){ //拆分两个链表
            p -> next = p -> next -> next;
            p = q -> next;
            if(!q -> next) break;
            q -> next = q -> next -> next;
            if(p) q = p -> next;
        }
        return clone_head;
    }
};

 

【JTAG】1149.6协议详解 JTAG1149.6协议是1149.1协议中Boundary-Scan结构的扩展,1149.1对交流耦合、差分或两者兼有的情况并没有得到充分的处理。该协议支持新的I/O测试结构。需要时变(AC)信号的高级I/O引脚允许测试它们之间的连接,这包括所有差分信号引脚或单端信号引脚,通过设计支持交流耦合。.................. 阅读详情

相关推荐

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2780

剑指offer 48. 复杂链表的复刻-java详细图解

Acwing 48. 复杂链表的复刻 原题链接 请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 注意: 函数结束后原链表要与输入时保持一致。 数据范围 链表长度 [0,500]。 代码案例: 题解 哈希表做法和更加巧妙的解法 主要思路是通过复制链表的方式,来解决random节点的查找问题。大体可以分为三步: 链表所有节点中间都插入一个复制节点,作为并行链表 遍历新链表,遇到Random节点后对应改变并行

qq_41810415的博客 215

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

AcWing 48 复杂链表的复刻

题目描述: 请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 分析: 可以用哈希表来将原链表来映射到新的链表,也可以不用hash,采用一种新的方式解决。 设原链表为abcdef,我们在每个结点后面插入新的结点,其值和前面结点一致。得到aAbBcCdDeEfF。然后比如a的random指向d,我们就...

昂昂累世士的博客 353

Gartner《构建可扩展数据产品建设框架》心得

数据产品化:从概念到落地的实践指南 当前企业正从传统数据需求模式转向数据产品化新范式。本文系统阐述了数据产品的核心价值、定义分类和实施框架,指出成功关键是将数据包装为可复用、可扩展的产品。Gartner框架强调产品思维,提出4阶段12步实施路径,涵盖设计、工程、发布和监控全流程。文章特别提醒要避免7大常见误区,如简单重命名报表、忽视元数据治理等,建议采取MVP策略,90天内完成从价值验证到产品落地的闭环。实施中需平衡技术选型与业务需求,建立跨职能团队,并通过AARRR模型持续追踪产品价值。

2501_91410404的博客 1005

DDR4技术原理详解

DDR4是DDR4-SDRAM的简写,即第4代DDR-SDRAM,DDR-SDRAM全称Double Date Rate Synchronous Dynamic Random Access Memory。本文重点解析DDR4技术规范及其背后的电子电路原理,以及编程使用DDR4过程中需要注意的性能事项。

ctbinzi的专栏 1万+

AcWing 48. 复杂链表的复刻

题目描述 请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 问题分析 此题有O(n)时间复杂度,并且空间复杂度为常数的算法,而且是此题的经典算法。1. 先把原链表的每个节点拷贝一份,就是在原链表的每个节点后面连接上一个该节点的拷贝。2. 然后把新创建的节点的random指向它的原节点的rando...

yj_coder的博客 292

3款 433MHz 收发模块对比:SYN480R vs RXB6 vs DL-TX19,实测卷帘门遥控距离

本文深度评测了3款433MHz收发模块SYN480R、RXB6与DL-TX19在卷帘门遥控距离、穿透性能和抗干扰能力等方面的表现。通过实测数据对比,分析了超外差、超再生和PLL锁相环技术的优劣,为智能家居和工业控制领域的无线遥控方案选型提供专业参考。

weixin_30700977的博客 393

复杂链表的复刻

请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 注意: 函数结束后原链表要与输入时保持一致。 算法: 先给每一个节点后面都复制一个节点; 让复制节点的random指向原有的节点random的指向; 把复制出来的节点串起来 C++代码: /** * Definition for singly-linked list with a random pointer. * struct ListNode

qq_45880043的博客 152

Trustzone/TEE/安全 面试100问-目录

关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,十年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计

baron-周贺贺-代码改变世界ctw 649

FAA机载电子硬件审查指南详解(评审和审查必备)

本咨询通告旨在协助认证机构、授权代表(包括组织授权)和申请人执行机载电子硬件评审(以下简称"硬件评审")。硬件评审的目的是评估机载电子硬件是否符合适航要求和建议的符合性方法(即RTCA/DO-254)。本工作辅助文件应作为评审过程中的参考工具使用。它不应被用作检查表,也不包含所有可能需要评审的情况。同样,本工作辅助文件也不是用来替代DO-254,而应与DO-254一起使用。此外,本工作辅助文件可能包含一些不适用于特定项目评估的问题。

qq_41854911的博客 610

复杂链表的复制(简单)

复杂链表的复制(简单) 时间限制:1秒 空间限制:32768K 本题知识点: 链表 题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针, 一个指向下一个节点,另一个特殊指针指向任意一个节点), 返回结果为复制后复杂链表的head。 (注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)牛客网题目链接:点击这里VS2010代码:#include<iostream> us

qianggezaici的博客 3939

Panda3d 场景管理

许多简单的 3D 引擎维护一个 3D 模型列表,然后在每一帧对这些模型进行渲染。在这些简单的引擎中,必须分配一个3D模型(或从磁盘加载它),然后将其插入到要渲染的模型列表中。模型在插入到列表中之前对渲染器不“可见”。 Panda3D稍微复杂一些。它不是维护要呈现的对象列表,而是维护要呈现的对象树。对象在插入树之前对渲染器不可见。

u014077947的博客 1383

[剑指offer] 复杂链表的复制 - Python

题目描述  输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 方法一: 思路:     1. 把复制的结点链接在原始链表的每一对应结点后面             2. 把复制的结点的random指针指向被复制结点的rand...

jiangjiane 4203

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复杂链表的复刻(剑指offer)

复杂链表的复刻 请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 注意: 函数结束后原链表要与输入时保持一致。 /** * Definition for singly-linked list with a random pointer. * struct ListNode { * int ...

Axelrod的博客 219

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AcWing 34. 链表中环的入口结点(快慢指针赛跑+地址映射)

1.快慢指针赛跑 这是一个做起来很巧妙的算法,而且这个方法既不会改变原链表的结构,又不会需要额外的空间。 具体的操作是:从头结点开始,令快指针每次移动两个单位,慢指针每次移动一个单位。如果链表有环则两个指针必定会在环上的某一个位置相遇。此时令快指针重回起点,然后让两个指针同时每次移动一个单位,当两个指针再次相遇时(必定会相遇),相遇的结点恰好就是环的入口结点。 证明如下: 假设链表...

Zee_Chao的博客 1493

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AcWing解题目录(C++)

# 试题名称 思想方法 难度 试题来源 1 A+B 简单 AcWing 2 01背包问题 简单 3 完全背包问题 简单 4 多重背包问题I 简单 5 多重背包问题II 中等 6 多重背包问题...

Zee_Chao的博客 900

AcWing 21. 斐波那契数列(迭代算法(或DP算法))

斐波那契数列的求法有很多种,这里只列举一种最简单的方法。我们先假设斐波那契数列是如下排列的: 下标 0 1 2 3 4 5 …… 数据 0 1 1 2 3 5 …… 我们先设置两个变量f和g,并分别初始化为0和1以代表第0号元素和第1号元素。然后我们可以很容易地发现,只要不断重复进行如下操作 f ...

Zee_Chao的博客 864

AcWing 1.A+B

具体代码如下: #include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a+b; return 0; }

Zee_Chao的博客 650

AcWing 23. 矩阵中的路径(DFS)

这是一道比较经典的深度优先搜索问题。首先,记录下每个字符串的起点位置。然后从每个位置开始进行深度优先搜索。 具体代码如下: class Solution { public: int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; bool dfs(vector<vector<char>...

Zee_Chao的博客 551

AcWing 51. 数字排列(DFS(有重复排列+无重复排列))

OJ上这道题的描述并不清晰。实际上,它的要求是输出所有“不重复的排列方式”。 1.next_permutation()(无重复排列) 要解决数组无重复排列的问题,那么这个方法是再合适不过的了。在使用这个函数前注意要引入<algorithm>头文件并且为了保证可以枚举所有情况要实现对数组进行“由小到大”的排序。 具体代码如下: class Solution { public...

Zee_Chao的博客 515

AcWing 14. 不修改数组找出重复的数字(分治法)

如果不将思考题考虑在内的话,那么AcWing 13.找出数组中重复的数字中的方法1的代码是可以完全移植过来的。这里不再赘述。不过,由于这道题的样例里面不存在含有超出范围的数据以及全部数据均出现一次的情况,因此代码还可以进一步简化。 简化后的具体代码如下: class Solution { public: int duplicateInArray(vector<int>...

Zee_Chao的博客 494

AcWing 13.找出数组中重复的数字(循环交换)

1.方法1 简单来说就是开辟一个空间为n的向量用来做数字出现次数的统计。由于题目只要求返回任意一个重复的数字,因此只需遍历统计向量找到首个记录出现次数大于1的数字即可。 具体代码如下: class Solution { public: int duplicateInArray(vector<int>& nums) { int n = nums...

Zee_Chao的博客 490

AcWing 15. 二维数组中的查找(非递归算法和递归算法)

1.非递归算法 观察此二维数组(以下称为“矩阵”),可以发现该矩阵的副对角线上的每一个元素均满足一个规律,那就是其左侧在同一行的元素均比其小,下侧在同一列的元素均比其大。于是,从副对角线入手进行查找就可以通过一次比较操作排除一整行和一整列的元素。从而大幅缩短时间开销。具体操作就是,当前位置元素如果等于目标元素则直接返回true,小于目标元素则将遍历指针下移一个单位,大于目标元素则将遍历指针左...

Zee_Chao的博客 467

AcWing 49. 二叉搜索树与双向链表(前驱后继+中序遍历)

1.利用前驱后继 对于一个二叉树,可以将其分为左子树、根节点和右子树三部分。根据题目要求可知将BST化为一个排好序的双向链表实际上就是将其中序遍历序列对应的各个节点连接起来。同时还可以知道若根的左右子树非空,则根节点在链表中的前驱结点一定在其左子树中,后继结点一定在其右子树中。那么可以先找到并标记根节点的前驱和后继,然后连接。同时递归执行这一过程便能达到要求。 具体代码如下: /** ...

Zee_Chao的博客 420
上一篇: AcWing 47. 二叉树中和为某一值的路径(DFS)
下一篇: AcWing 49. 二叉搜索树与双向链表(前驱后继+中序遍历)
Zee_Chao
博客等级 码龄11年 168粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值