LeeCode每日一题--合并两个有序数组

  【前言】坚持日更LeeCode刷题系列

    不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!


  【题目】88.合并两个有序数组

    题目描述:给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。

    说明:
      初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
      你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。


    示例:

    	示例 1:
    		输入:
    			nums1 = [1,2,3,0,0,0], m = 3
				nums2 = [2,5,6],       n = 3
				
			输出: [1,2,2,3,5,6]

    思路一:将nums2中的元素代替nums1中用于存储而保留位置的‘0’,再对其使用排序函数即可。具体代码如下:

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        nums1.reverse()   #通过将列表反转,便于替换操作
        for i in range(len(nums2)):
            nums1[i] = nums2[i]
        return nums1.sort()

    运行结果:
    在这里插入图片描述


    思路二:定义两个flag,初值为0,分别标记nums1,nums2当前判断位置,如果nums1<=nums2,则将nums1的值保存,flag1加一,否则保存nums2的值,flag2加一,但注意如果此时flag1==n,或者 flag2 ==m,则跳出判断,并将未判断的值直接添加。具体内容如下:

class Solution(object):    
    def merge(self,nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        nums1_copy = nums1[:]  #复制nums1
        flag_1 = 0  #标记,作指针用
        flag_2 = 0  #标记,作指针用
        count = 0   #用于判断终止的条件
        while count < m+n:
            if flag_1 == m:  #此时将nums2内未判断的值加入
                nums1 = nums1[:m+n-flag_2-1] + nums2[flag_2:]
                break
            elif flag_2 == n: #将nums1内未判断的值加入
                nums1 = nums1[:] + nums1[flag_1:m+n]
                break
            else:
                if(nums1_copy[flag_1]<=nums2[flag_2]): #如果小于nums2内值,则将nums1内值存入,flag1加一
                    nums1[count] = nums1_copy[flag_1]
                    flag_1 = flag_1+1
                    count = count+1
                else:		#如果大于nums2内值,则将nums2内值存入,flag2加一
                    nums1[count] = nums2[flag_2]
                    flag_2 = flag_2+1
                    count = count+1
        return nums1

    运行结果:未通过编译,我当时甚至一度怀疑人生,因为我print出来的nums1和return的nums1在同一个位置,但出现了不同值,不过直到后来我看到了题目中的None Do not return anything, modify nums1 in-place instead我才意识到事情不是我想象的那样,这也算给自己一个警示把,下面附上官方类似思路解答的代码。

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        # Make a copy of nums1.
        nums1_copy = nums1[:m] 
        nums1[:] = []

        # Two get pointers for nums1_copy and nums2.
        p1 = 0 
        p2 = 0
        
        # Compare elements from nums1_copy and nums2
        # and add the smallest one into nums1.
        while p1 < m and p2 < n: 
            if nums1_copy[p1] < nums2[p2]: 
                nums1.append(nums1_copy[p1])
                p1 += 1
            else:
                nums1.append(nums2[p2])
                p2 += 1

        # if there are still elements to add
        if p1 < m: 
            nums1[p1 + p2:] = nums1_copy[p1:]
        if p2 < n:
            nums1[p1 + p2:] = nums2[p2:]

作者:LeetCode
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
来源:力扣(LeetCode)

    运行结果:
    在这里插入图片描述
    果然,官方就是官方,虽然同一个思路,但是代码的简洁性相比较,根本不在一个量级,所以需要改进的地方还很多!此外,官方还提供了一种独特的优化思路二的做法,在下面我会附上链接,有兴趣的朋友可以自行查看。


    关于其中一些知识的链接:

    Python 算法图解


    分享就到这里了,欢迎大家一起交流讨论。


    注明

    题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-sorted-array

发布了32 篇原创文章 · 获赞 62 · 访问量 1308

猜你喜欢

转载自blog.csdn.net/Mingw_/article/details/104743417