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的一些操作
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。