合并两个有序数组
题目描述:
解题思路:
- 第一种:这个方法是我一开始想到的,我想着因为要把
nums2
的数放到nums1
里头的后面,然后把0代替,所以我就直接用for
把后面的0的位置的数字换成nums2
的数,最后用sort()
排序得到最后的nums1
。时间复杂度也不是很好,需要进一步改进。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
lens = len(nums1)
for i in range(m, lens):
nums1[i] = nums2[i-m]
nums1.sort()
- 第二种:这个方法实在第一种方法下的稍微改进,只用了一行代码,直接重新把
nums1
的前面m个数加上nums2
的数组成一个列表,然后用sorted()
排序。 - 虽然代码量很少,但是时间复杂度比较差,为O((n+m)log(n+m))。
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
Do not return anything, modify nums1 in-place instead.
"""
nums1[:] = sorted(nums1[:m] + nums2)
- 第三种:我通过学习发现了可以用双指针的方法来写,这里有两种写法,一种从前往后比较,这种方法发现如果要从前往后的话需要重新再设一个数组来存放数组,会增大空间复杂度,所以这里我说下从后往前比较的这个双指针方法。这个方法不需要重新定义一个数组,可以直接在
nums1
中进行操作,因为这两个数组都是有序的,所以这个方法主要是在于通过比较nums1
的第m个数字和nums2
的第n的数字大小,然后把最大的放到最后,然后最大的那个数组比较的数字位置往前移一位,以此类推。如果最后nums2
中的数字全部都通过比较进了nums1
里,然后直接输出即可,但是如果等nums1
中的数字都比较完了,而nums2
中还有剩余数字未被比较,说明这些数字是最小的了,所以直接放在nums1
数组最前面就可以了。 - 这个方法的时间复杂度小了很多,为O(n+m),空间复杂度也只有O(1)。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1 = m-1
p2 = n-1
p = m+n-1
while p1 >= 0 and p2 >= 0:
if nums2[p2] > nums1[p1]:
nums1[p] = nums2[p2]
p2 -= 1
else:
nums1[p] = nums1[p1]
p1 -= 1
p -= 1
if p2 >= 0:
nums1[:p2 + 1] = nums2[:p2 + 1]