复杂链表的复刻(三十六)

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

题目
请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

注意:

  • 函数结束后原链表要与输入时保持一致。

算法
思想:将当前节点复制一份并且插入到当前节点的后面,然后再链接虚拟节点,最后进行拆分。不能直接返回原链表,系统会判别,最后还要将原链表恢复。
时间复杂度:O(n)
在这里插入图片描述

class Solution {
    public ListNode copyRandomList(ListNode head) {
    	//第一次遍历将每个节点复制一份插入到当前节点的后面
        for(ListNode p = head;p != null;){
            ListNode newP = new ListNode(p.val);
            ListNode next = p.next;
            p.next = newP;
            newP.next = next;
            p = next;
        }
        //为复制的节点添加随机节点
        for(ListNode p = head;p != null;p = p.next.next){
            if(p.random != null){
                p.next.random = p.random.next;
            }
        }
        
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;
        for(ListNode p = head;p != null;p = p.next){
            cur.next = p.next;
            cur = cur.next;
            //这一步操作是为了还原链表
            p.next = p.next.next;
        }
        
        return dummy.next;
    }
}

其他做法:
用hashmap将每个节点先进行copy,然后用原节点做key,复制节点做value存进hashmap
然后遍历链表,把复制节点取出连好即可,因为hashmap的增删改查是O(n)。所以时间复杂度很低。

class Solution {
    public ListNode copyRandomList(ListNode head) {
        if(head==null)
            return null;

        Map<ListNode,ListNode> copy = new HashMap<>();

        ListNode node = head;
        while(node!=null){
            ListNode CloneNode = new ListNode(node.val);
            copy.put(node,CloneNode);
            node = node.next;
        }

        node = head;
        ListNode CloneHead = copy.get(node);
        ListNode CloneNode = CloneHead;

        while(node!=null){
            CloneNode.next = copy.get(node.next);
            if(node.random!=null){
                CloneNode.random = copy.get(node.random);
            }
            CloneNode = CloneNode.next;
            node = node.next;
        }

        return CloneHead;

    }
}
带你一分钟了解电感与磁珠的区别 在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。 阅读详情

相关推荐

智能驾驶功能软件平台设计规范 第一部分:系统架构

智能驾驶功能软件平台设计规范 第一部分:系统架构2020-07-29 发布。

爱是与世界平行 6744

java学习笔记6

Java foreach语句数组数组也是引用类型数组Java多维数组Class类型 Java foreach语句 使用 foreach 循环遍历数组元素时无须获得数组长度,也无须根据索引来访问数组元素。 for(类型 变量名:集合) { 语句块; } 其中,“类型”为集合元素的类型,“变量名”表示集合中的每一个元素,“集合”是被遍历的集合对象或数组。 foreach 循环和普通循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach 循环自动迭代数组的每个元素,当每.

qq_62096086的博客 323

从CPRI到eCPRI:手把手教你用Wireshark分析基站前传协议帧结构

本文手把手教你使用Wireshark工具,深入解析从CPRI到eCPRI的基站前传协议帧结构。通过搭建分析环境、编写解析脚本,并对比两者在时延管理、帧格式及数据封装上的差异,为无线通信领域的研发与测试人员提供了一套实用的逆向分析与故障排查方法。

x8y9z0的博客 604

斐波那契数列(九)

题目 输入一个整数 n ,求斐波那契数列的第 n 项。 假定从0开始,第0项为0。(n<=39) 样例 输入整数 n=5 返回 5 算法: (递推) O(n) 这题的数据范围很小,我们直接模拟即可。 当数据范围很大时,就需要采用其他方式了,可以参考 求解斐波那契数列的若干方法 。 用两个变量滚动式得往后计算,a 表示第 n−1 项,b 表示第 n 项。 则令 c=a+b表示第 n+1 项,然后让 a,b顺次往后移一位。 时间复杂度分析 总共需要计算 n次,所以时间复杂度是 O(n)。 class So

software_Manito的博客 512

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

【R】非参数秩和检验(Kruskal-Wallis H)与事后多重比较邓肯检验(Dunn‘s Test)及自动字母标记

非参数检验-Kruskal-Wallis H检验-多个独立样本秩和检验-事后两两比较-邓肯检验(Duncan's test)

captain_keating的博客 6536

找出数组中重复的数字(一)

算法 (数组遍历) O(n) 首先遍历一遍数组,如果存在某个数不在0到n-1的范围内,则返回-1。 下面的算法的主要思想是把每个数放到对应的位置上,即让 nums[i] = i。 从前往后遍历数组中的所有数,假设当前遍历到的数是 nums[i]=x,那么: 如果x != i && nums[x] == x,则说明 x 出现了多次,直接返回 x 即可; 如果nums[x] != x,那我们就把 x 交换到正确的位置上,即 swap(nums[x], nums[i]),交换完之后如果nums[i

software_Manito的博客 391

Unity简单操作:PostProcessing的使用

Postprocessing是一个unity2018版本的集成后期插件,有了这个插件,之后用unity开发时,后期调整颜色、光晕等会很方便。 目录 新建一个postprocessing profile(配置文件)。​ 参数说明: 新建一个postprocessing profile(配置文件)。 在主相机下加一个组件PostProcess Layer。 注意:需要将相机的Layer层设置与Post Process Layer 下的Volume blending(体积混合)...

weixin_39114763的博客 7368

二叉搜索树的后序遍历序列(三十四)

题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true,否则返回false。 假设输入的数组的任意两个数字都互不相同。 样例 输入:[4, 8, 6, 12, 16, 14, 10] 输出:true 算法 后序遍历的最后一个节点是是根节点,所以我们只要找出比根节点小的部分为左子树,然后判断右边部分是否存在比根节点小的值,如果有返回false,否则的话就进行递归调用。 class Solution { int[] seq; public boole

software_Manito的博客 364

win10安装openvpn客户端

进入C:\Program Files\TAP-Windows\bin目录,然后右键用管理员权限执行addtap.bat文件,此文件执行会创建一个网卡。链接:https://pan.baidu.com/s/1KAifTiP7qp1i5ZkfdnfwkA。4.2 进入安装目录的config下新建一个文件夹,将证书文件全部挪进去(不移动.ovpn文件)3.4 将拿到的ssl认证文件放入安装目录的config目录下。然后修改ovpn文件 “./”代表当前路径,第二个链接重复。3.1 一直下一步到这里打上勾。

qq_36200932的博客 3万+

[HCTF 2018]WarmUp 1学习记录

#[HCTF 2018]WarmUp 1学习笔记 最近做了做ctf,觉得真的很有趣,后悔当初没早点做,不过之前的学习也让我得到了不少经验基础,废话不多说,这次ctf虽然基本上靠了网上的大佬们(因为比较菜),但自己也做了些思考,应该对新手也比较友好吧。 ##1 首先怎么找源码,我承认我确实刚开始不知道在哪找,不过也很快找到了,相信也会有部分新手和我差不多吧 然后下面控制台会有个temp0,然后直接回车 后面我就受到启发,直接在链接后面加上source.php,进行页面跳转,然后就可以开始PHP代码审计了。

weixin_45869407的博客 684

二进制中1的个数(十四)

题目 输入一个32位整数,输出该数二进制表示中1的个数。 注意: 负数在计算机中用其绝对值的补码来表示。 样例1 输入:9 输出:2 解释:9的二进制表示是1001,一共有2个1。 样例2 输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。 算法 使用n&(n-1)来计算n二进制中一的个数,这个操作会将原来最右边的1变成0 时间复杂度O(logn) class Solution { publi

software_Manito的博客 350

DeiT详解:知识蒸馏的Transformer

DeiT模型(8600万参数)仅用一台 GPU 服务器在 53 hours train,20 hours finetune,仅使用 ImageNet 就达到了 84.2 top-1 准确性,而无需使用任何外部数据进行训练,性能与最先进的卷积神经网络(CNN)可以抗衡。其核心是提出了针对 ViT 的教师-学生蒸馏训练策略,并提出了方法,使得在视觉领域训练得又快又好。

走在深度学习前沿的小宋 2636

剪绳子(十三)

题目 给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2)。 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘积是多少? 例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。 样例 输入:8 输出:18 算法: 当n<5时,我们会发现,无论怎么剪切,乘积product <= n,n为4时,product最大为2*2=4; 当n>=5时,可以证明2(n-2)

software_Manito的博客 328

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

矩阵中的路径(十一)

题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 注意: 输入的路径不为空; 所有出现的字符均为大写英文字母; 样例: matrix= [ [“A”,“B”,“C”,“E”], [“S”,“F”,“C”,“S”], [“A”,“D”,“E”,“E”] ] str=“BCCE” , return “true” str

software_Manito的博客 320

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

树的子结构(二十五)

题目 输入两棵二叉树A,B,判断B是不是A的子结构。 我们规定空树不是任何树的子结构。 样例 树A: 树B: 返回 true ,因为B是A的子结构。 算法 (二叉树,递归) O(nm) 代码分为两个部分: 遍历树A中的所有非空节点R; 判断树A中以R为根节点的子树是不是包含和树B一样的结构,且我们从根节点开始匹配; 对于第一部分,我们直接递归遍历树A即可,遇到非空节点后,就进行第二部分的判断。 对于第二部分,我们同时从根节点开始遍历两棵子树: 如果树B中的节点为空,则表示当前分支是匹配的,返回true

software_Manito的博客 315

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

栈的压入、弹出序列(三十)

题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。 假设压入栈的所有数字均不相等。 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。 样例 输入:[1,2,3,4,5] [4,5,3,2,1] 输出:true 算法 (栈) O(n) 用一个新栈s来模

software_Manito的博客 313

分行从上往下打印二叉树(三十二)

题目 从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。 样例 算法 BFS(O(n)) 依旧是宽度优先遍历,相比不分行从上到下打印,只需要记住这一层需要弹出队列多少次数即可,对应代码里面的n。 当队列不为空时 记录下当前队列的长度n,这个长度对应树的当前层有多少个节点 相比较上一题,这次在一个循环里面,只弹出n个节点就好了。弹出过程中存储当前节点到temp数组 弹出n个节点之后,将temp数组存入result 时间复杂度 每个节点遍历1遍,O(N)复杂度 class Sol

software_Manito的博客 295

二叉搜索树与双向链表(三十七)

题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。 注意: 需要返回双向链表最左侧的节点。 例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。 算法: class Solution { public TreeNode convert(TreeNode root) { if(root == null) return root; Pair<TreeNode,TreeNode

software_Manito的博客 288

二叉树中和为某一值的路径(三十五)

题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 样例 算法 class Solution { List<List<Integer>> res = new ArrayList(); List<Integer> path = new ArrayList(); public List<List<Integer>> findPath(Tree

software_Manito的博客 286

机器人的运动范围(十二)

题目 地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。 但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 请问该机器人能够达到多少个格子? 样例1 输入:k=7, m=4, n=5 输出:20 样例2 输入:k=18, m=40, n=40 输出:1484 解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。 但是,它不能进入方格(35,38),

software_Manito的博客 284

不分行从上往下打印二叉树(三十一)

题目 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。 样例 算法 (BFS) O(n) 我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。 这样我们会: 先扩展根节点; 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点; 再依次从左到右扩展第三层节点; 依次类推 所以BFS的顺序就是这道题目要求的顺序。 时间复杂度 BFS时每个节点仅被遍历一次,所以时间复杂度是 O(n)。 class Solution { public List<In

software_Manito的博客 281

二叉树的镜像(二十六)

题目 输入一个二叉树,将它变换为它的镜像。 样例 算法 (二叉树,递归) O(n) 我们可以发现镜像后的树就是将原树的所有节点的左右儿子互换! 所以我们递归遍历原树的所有节点,将每个节点的左右儿子互换即可。 时间复杂度 原树仅被遍历一次,所以时间复杂度是 O(n)。 class Solution { public void mirror(TreeNode root) { if(root == null) return ; if(root.left != null |

software_Manito的博客 269

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 217

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 314

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 589
上一篇: 二叉树中和为某一值的路径(三十五)
下一篇: juc并发编程
software_Manito
博客等级 码龄8年 6粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值