力扣练习3.28

138. 随机链表的复制

浅拷贝和深拷贝:
前者新建一个数据结构,不创建元素副本;
后者不仅新建一个数据结构,而且新建一个数据副本。

深拷贝(Deep Copy)和浅拷贝(Shallow
Copy)是在复制数据结构时常见的两个概念,特别是在涉及复杂对象(如链表、树等)时。这两种拷贝方式的主要区别在于它们对原数据结构中对象的处理方式。

浅拷贝(Shallow Copy)

  • 浅拷贝创建一个新的数据结构(如新的链表或数组)但是不创建数据结构中的元素的副本
  • 在浅拷贝中,新数据结构中的元素仍然指向原有数据结构中的相同元素(即对象的引用被复制,而不是对象本身)。
  • 如果原数据结构中的对象被修改,这些修改也会反映在浅拷贝的数据结构中,因为它们共享相同的对象。

深拷贝(Deep Copy)

  • 深拷贝不仅创建一个新的数据结构,还为原数据结构中的每个元素创建副本
  • 在深拷贝中,新数据结构的元素是原元素的副本,这意味着它们是完全独立的。
  • 对原数据结构或深拷贝数据结构中的对象进行的修改不会影响另一个,因为它们不共享对象。

在链表的上下文中

假设有一个链表,其中每个节点都有一个random指针,可以指向链表中的任何节点或null

  • 深拷贝这个链表意味着创建一个新链表,其中包含原链表每个节点的副本,且每个副本节点的nextrandom指针都指向新链表中的对应节点,而不是原链表中的节点。
  • 浅拷贝这个链表则意味着创建一个新链表,但是不为原链表中的节点创建副本。在这种情况下,复制链表中的节点将直接指向原链表中的节点,这通常不是我们想要的。

深拷贝链表的方法

  1. 遍历原链表,为每个原节点创建一个新节点,这个新节点的值与原节点相同,但是nextrandom指针暂时留空。
  2. 建立一个映射关系,将原节点映射到对应的新节点,以便能够设置random指针。
  3. 再次遍历原链表,这次使用映射来设置每个新节点的nextrandom指针。

这种方法确保了每个新节点都与原链表中对应的节点分离,实现了深拷贝。

"""
# Definition for a Node.
class Node:def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):self.val = int(x)self.next = nextself.random = random
"""class Solution:def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':if not head: return # 建立映射关系 {原节点:新节点}old_new = dict()cur = head # 当前节点while cur:old_new[cur] = Node(cur.val, None, None) # 指针部分留空,不然就指向原始链表了cur = cur.next # 往后遍历# 设置新节点的指针,也是从原始的头节点开始cur = headwhile cur:# 如果有后序节点,就将其从Null更新为原始链表中的后续节点if cur.next:old_new[cur].next = old_new[cur.next]if cur.random:old_new[cur].random = old_new[cur.random]cur = cur.nextreturn old_new[head]

297. 二叉树的序列化与反序列化

解题思路:
序列化是将二叉树编码成一个字符串
反序列化是将这个字符串解码成一个二叉树。
针对序列化:考虑使用层序遍历的方法,将二叉树的节点自上而下、从左往右地放在字符串里。不能忘了空节点,使用特殊符号占位,并分隔;
针对反序列化:针对字符串根据分隔符转换为list,初始化根节点,另其值等于list的首个元素。然后按照层序遍历的方式,将每层的节点指向列表的对应元素值,使用一个全局的索引变量解决。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Codec:def serialize(self, root):"""Encodes a tree to a single string.:type root: TreeNode:rtype: str"""# 序列化# 层序遍历,将其结果都存储到一个字符串,用;分隔if not root: return '#;'res = ''queue = [root]while queue: # 因为最后只要一个字符串,所以就省略了node = queue.pop(0)# 如果节点存在,结果字符串加上节点的值if node: res += f'{node.val};'queue.append(node.left) # 加左子节点queue.append(node.right) # 右子节点else: # 如果是空,那就加上空值占位符res += '#;'return resdef deserialize(self, data):"""Decodes your encoded data to tree.:type data: str:rtype: TreeNode"""# 反序列化# 将字符串拆分为listif data == '#;': return Nonenodes = data.split(';')[:-1] # 因为这样分隔最后会出现空格,删除root = TreeNode(int(nodes[0])) # 根节点设置# 类似层序遍历queue = [root] # 层序遍历的起始index = 1 # 记录数组索引,0已经被定义了(根节点)while queue:node = queue.pop(0) # 第一次就是根节点# 如果当前节点不为空,也就是 不是#if nodes[index] != '#': node.left = TreeNode(int(nodes[index])) # 按照层序遍历,是从左到右的queue.append(node.left) # 队列结尾加上下一层的左节点 index += 1 # 左边的经过处理后就索引+1,不管是不是空值# 对右边执行相同操作if nodes[index] != '#':node.right = TreeNode(int(nodes[index]))queue.append(node.right)index += 1# 返回根节点return root# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))

209. 长度最小的子数组

解题思路:双指针,滑动窗口。
从开始,逐步扩展窗口,检测是否满足求和条件;一旦满足,就缩减窗口,满足的时候也要比较最小的窗口长度。
可以使用for循环或者两层while。要注意的是for循环默认在执行完循环主体后进入下一个遍历。while循环需要手动在最后加,如果在前面加那么最小长度就不能+1,因为此时右指针正好跑过满足条件的窗口了。

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:# 双指针,滑动窗口# 先不断扩展窗口,等满足条件就逐步缩小窗口# 左指针left = 0temp = 0 # 窗口内的和min_len = float('inf') # 最小长度# 循环for right in range(len(nums)):# 窗口内总和temp += nums[right]# 满足条件,开始缩减窗口while temp >= target:min_len = min(min_len, right-left+1)temp -= nums[left]left += 1# 检测最终是否有最短的存在if min_len != float('inf'):return min_lenelse:return 0

使用两层while循环

def minSubArrayLen(target, nums):n = len(nums)min_len = float('inf')  # 初始化为无穷大,用以比较找到最小长度sum = 0  # 窗口内元素的总和left, right = 0, 0  # 双指针,都初始化为0while right < n:# 扩大窗口sum += nums[right]right += 1# 当窗口内的总和大于等于target时,尝试缩小窗口以找到最小长度while sum >= target:min_len = min(min_len, right - left)sum -= nums[left]left += 1return min_len if min_len != float('inf') else 0

139. 单词拆分

这个问题可以通过动态规划来解决。动态规划是一种解决复杂问题的方法,它将问题分解成更小的子问题,通过解决子问题来解决整个问题。

动态规划思路

定义状态:定义一个布尔类型的动态规划数组dp,其中dp[i]表示字符串s的前i个字符(s[0..i-1])能否被字典wordDict中的一个或多个单词拼接得出。

状态转移:为了确定dp[i]的值,我们需要遍历[0, i)的所有可能的分割点j,检查两个条件:

  1. 字符串s[j..i-1](即从ji-1的子串)是否存在于字典wordDict中。
  2. dp[j]是否为true,表示s[0..j-1]可以被拼接得出。

如果上述两个条件中的任何一个为true,则dp[i]也为true

初始化dp[0] = true,表示空字符串总是可以被表示。

目标:检查dp[s.length()]的值,如果为true,表示整个字符串s可以用字典中的一个或多个单词拼接得出。

示例代码

def wordBreak(s, wordDict):word_set = set(wordDict)  # 将字典转换为集合,便于查找dp = [False] * (len(s) + 1)dp[0] = True  # 空字符串总是可以被表示for i in range(1, len(s) + 1):for j in range(i):if dp[j] and s[j:i] in word_set:dp[i] = Truebreak  # 一旦找到一个有效的分割点,就可以停止查找return dp[-1]

解释

  • 循环遍历字符串s的所有子串。
  • 对于每个子串s[j:i],如果dp[j]true且子串在wordDict中,说明找到了一个有效的分割点j,将dp[i]设置为true
  • 最终,dp[-1](或dp[len(s)])的值会告诉我们是否可以用字典中的单词拼接出整个字符串s

这种方法通过动态规划避免了重复计算和不必要的搜索,有效地解决了问题。

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

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

相关文章

微服务demo(二)nacos服务注册与集中配置

环境&#xff1a;nacos1.3.0 一、服务注册 1、pom&#xff1a; 移步spring官网https://spring.io&#xff0c;查看集成Nacos所需依赖 找到对应版本点击进入查看集成说明 然后再里面找到集成配置样例&#xff0c;这里只截一张&#xff0c;其他集成内容继续向下找 我的&#x…

There is no getter for property named ‘deleted‘

实体类在继承BaseEntity的时候,由于没填写deleted参数名导致mybatis报错 这时候要么改application.yml里的mybatis参数&#x1f447; 要么就将BaseEntity基类的delete上加个existfalse&#x1f447;(推荐)

【ctf.show】--- md5

ctf.show_web9 1.用 dirsearch 扫目录&#xff1a;python dirsearch.py -u 网址 -e php 发现 robots.txt 2.访问 robots.txt 文件 发现 index.phps 3.访问 index.phps 发现源码 <?php $flag""; $password$_POST[password]; if(strlen…

Ventoy装机

文章目录 Ventoy安装操作系统问题U盘无法识别问题BIOS设置图片 Ventoy安装操作系统问题 当前使用的m.2&#xff08;nvm&#xff09;可以使用在台式机上。 "verification failed sercury violation"这个问题似乎与使用Ventoy创建启动盘并在启用了Secure Boot&#x…

被迫走上前端之路第六课之vue的v-for列表渲染

文章目录 语法举个栗子动态显示数组动态显示字典动态显示对象 嵌套实现 有时候我们需要动态显示一些标签重复的内容或者可迭代数据&#xff0c;如果手动一条条实现有点麻烦&#xff0c;而且代码看着不美观&#xff0c;这个时候就要用到v-for来实现 语法 其中&#xff0c;items…

速盾:cdn配置ssl

CDN&#xff08;Content Delivery Network&#xff09;是一种内容分发网络&#xff0c;它的作用是将原始服务器上的内容分发到全球各地的边缘节点上&#xff0c;以提高用户访问速度和稳定性。随着数据传输的安全性要求越来越高&#xff0c;配置SSL&#xff08;Secure Sockets L…

C++——vector类及其模拟实现

前言&#xff1a;前边我们进行的string类的方法及其模拟实现的讲解。这篇文章将继续进行C的另一个常用类——vector。 一.什么是vector vector和string一样&#xff0c;隶属于C中STL标准模板库中的一个自定义数据类型&#xff0c;实际上就是线性表。两者之间有着很多相似&…

从关键词到上下文:GPT 如何重新定义 SEO 策略

如何利用GPT技术革新SEO内容创建&#xff1f; 新的 SEO 格局 探索 SEO 的快速变化&#xff0c;重点关注从以关键字为中心的策略到更深入地了解用户意图和上下文的转变。 GPT 简介及其对内容创建、用户参与和搜索引擎优化 (SEO) 的革命性影响。 了解 GPT&#xff1a;技术范式转…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

python基础知识3——列表和元组

python基础知识学习笔记之常用数据类型操作 1、列表 1.1、列表的概念和定义 概念&#xff1a;列表是有序的可变的元素集合。 定义&#xff1a; 方式1&#xff1a;[ 元素1, 元素2…] names ["zhangsan", "lisi", "wangwu"] print(names, type…

网络爬虫框架Scrapy的入门使用

Scrapy的入门使用 Scrapy概述引擎&#xff08;Engine&#xff09;调度器&#xff08;Scheduler&#xff09;下载器&#xff08;Downloader&#xff09;SpiderItem Pipeline 基本使用安装scrapy创建项目定义Item数据模型对象创建爬虫(Spider)管道pipeline来保存数据启动爬虫 其他…

消费盲返:新型返利模式引领购物新潮流

消费盲返&#xff0c;一种引领潮流的新型消费返利模式&#xff0c;其核心在于&#xff1a;消费者在平台选购商品后&#xff0c;不仅能享受优惠价格&#xff0c;更有机会获得后续订单的部分利润作为额外奖励。这种创新的返利机制&#xff0c;既提升了消费者的购物体验&#xff0…

AUTOSAR关于内存栈的分层及描述

首先关于关于内存栈的分层&#xff1a;如下图所示&#xff0c;Nvm靠近RTE的&#xff1b;MemIf居中&#xff0c;EA和FEE被包含其中。 其次关于这三层的缩写&#xff1a;可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流&#xff1a; 和大致的结构分层作用&am…

使用argocd作为cd流程

一、前言 讲述关于argocd在cicd流程中的使用&#xff0c;ci这里使用gitlabjenkins流水线的方式&#xff0c;jenkins用于拉代码打包、构建镜像、变更yaml文件的镜像、推送变更的yaml文件到gitlab的gitops仓库中&#xff0c;最后再有argocd实现cd流程&#xff0c; 二、使用 关于…

​网络安全相关证书资料​——OSCP、CISP-PTE

网络安全相关证书有哪些&#xff1f;——就实战型看&#xff0c;OSCP、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09;最好。 网络安全相关证书有哪些&#xff1f; 网络安全相关证书有哪些呢&#xff1f;了解一下&#xff01; 1. CISP &#xff08;国家注册信息安全…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

WinSock Api connect超时函数实现方法

当调用listen(serverSocket, 1)时&#xff0c;1表示服务器同时处理的连接请求的最大数量。在这种情况下&#xff0c;服务器只能处理一个客户端连接请求。如果客户端尝试连接时&#xff0c;服务器正在处理一个连接请求&#xff0c;客户端将被阻塞&#xff08;即死等&#xff09;…

性能小钢炮,美学艺术品!佰维PD2000移动固态硬盘新品即将上市

开春时节&#xff0c;想必大家已经准备踏上春游旅程。每到一个景点&#xff0c;或许总想记录精彩的瞬间&#xff0c;留存优美的景色。但由于手机存储容量有限&#xff0c;很多时候我们拍不了多少照片&#xff0c;手机就开始提示存储空间不足。而iCloud昂贵的云存储价格也让人望…

linux生产桌面程序并实现开机自启动

1.生产桌面程序 编写桌面文件脚本 创建一个桌面脚本文件&#xff0c;后缀名为desktop&#xff0c;我的为my.desktop,文件内容如下 [Desktop Entry] Version1.0 Namemy Comment this app use for ljs Exec/home/ljs/myTestApp Icon/home/ljs/icon.png Terminalfal…

2023年后端面试总结

备注&#xff1a;这篇文章是我在2023年年初在自己的网站上写的&#xff0c;最近在迁移技术文章&#xff0c;我感觉这个也是和咱程序员相关&#xff0c;所以今天就决定把它迁移过来。 .......................................................................分割线..........…