zoukankan      html  css  js  c++  java
  • 88. Merge Sorted Array

    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 也是完全正确的。
    因此对思路一进行代码修改,顺利通过
    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的一些操作

     

     
  • 相关阅读:
    类模板机制
    C和C++中const的区别
    bitset
    静态库or动态库?
    多态原理探究
    程序从编译到运行过程
    对象的内存模型
    重载、重写(覆盖)和隐藏
    对继承和派生的理解
    对C++对象的理解
  • 原文地址:https://www.cnblogs.com/henuliulei/p/13230577.html
Copyright © 2011-2022 走看看