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

Nona ·
更新时间:2024-11-11
· 866 次阅读

  【前言】坚持日更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


作者:Mingw_



leecode 数组

需要 登录 后方可回复, 如果你还没有账号请 注册新账号