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