88. Merge Sorted Array
思路一:把nums2直接复制到nums1中,然后sort,但是你会发现地址在sort时返回的地址已经发生改变,所以这种解法是不对的。
class Solution: def merge1(self,nums1,m,nums2,n): print(id(nums1)) len1 = len(nums1) len2 = n for i in range(len1-len2,len1): nums1[i] = nums2[i-(len1-len2)] print(id(nums1)) nums1 = sorted(nums1) print(id(nums1))#此时nums1的地址被sorted改变,所以nums1是新地址,不符合题中不能用新空间 #print(nums1) nums1 = nums1[(len1-m-n):] print(id(nums1))#肯定首地址都发生变化了 return nums1 #print(nums1)
先贴出来,等下分析关于python的复制时地址的问题。
思路二:尽量对nums1进行改变,把大的数从后向前复制,并保持nums1的地址一直没有发生改变
1 def merge2(self, nums1, m, nums2, n): 2 a = m-1 3 b = n-1 4 c = m + n -1 5 if n == 0: 6 pass 7 elif 0 == m: 8 nums1[:n] = nums2[:n] 9 else: 10 while (a >= 0)and(b >= 0): 11 if nums1[a] <= nums2[b]: 12 nums1[c] = nums2[b] 13 b = b-1 14 c = c-1 15 else: 16 nums1[c] = nums1[a] 17 c = c-1 18 a = a-1 19 if a >= 0: 20 pass 21 if b >= 0: 22 nums1[:b+1] = nums2[:b+1] 23 return nums1
接下来分析下nums1 = ......和nums1[:]前者复制地址会发生变化后者不会发生任何改变的原因:

到这里我们就明白了为何要使用 nums1[:]。这里 sorted() 函数返回的必然是一个新的对象,因此我们需要 nums1[:], 而 [] 也代表一个新的 list 对象,我们需要用 nums1[:] = []。
ps: 如果没有就地修改的要求,则用 nums1 也是完全正确的。
ps: 如果没有就地修改的要求,则用 nums1 也是完全正确的。
因此对思路一进行代码修改,顺利通过
1 class Solution: 2 def merge(self,nums1,m,nums2,n): 3 len1 = len(nums1) 4 len2 = n 5 for i in range(len1-len2,len1): 6 nums1[i] = nums2[i-(len1-len2)] 7 print(id(nums1)) 8 nums1[:] = sorted(nums1)#加冒号指向自己的地址,不加冒号指向新的被赋值地址 9 nums1[:] = nums1[(len1-m-n):]
下面讲一下关于list的一些操作
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!