您的位置:首页 > 其它

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

2020-03-15 18:21 477 查看

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

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


  【题目】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

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
Mingw_ 发布了36 篇原创文章 · 获赞 64 · 访问量 2774 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: