Leetcode--合并两个有序数组(88)

题目描述:

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 使 nums1 成为一个有序数组。

Leetcode--合并两个有序数组(88)           Leetcode--合并两个有序数组(88)

 

思路一:直接利用python中的sorted()函数

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        nums1[:] = sorted(nums1[:m] + nums2)

时间复杂度:O((n+m)log(n+m)) 空间复杂度O(1)

思路二:利用数组的切片[:]

 1 class Solution:
 2     def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
 3         i,j = 0,0
 4         while (j < n and i < m+n):
 5             if nums1[i] < nums2[j]:
 6                 i += 1
 7             else:
 8                 nums1[i+1:] = nums1[i:m+n-1]
 9                 nums1[i] = nums2[j]
10                 i += 1
11                 j += 1
12         if j < n:   #考虑nums2还没遍历完的情况
13             nums1[m+j:] = nums2[j:]
14         

思路三:由于nums1数组最后几位均为0,因此从末尾开始改写nums1会有更小的空间复杂度。

 1 class Solution:
 2     def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
 3         i,j,k = m-1,n-1,m+n-1  
 4         #i指向nums1的最后一个非0元素,j指向nums2的最后一个元素,k指向nums1的末尾
 5         while(i>=0 and j>=0):
 6             if nums1[i] <= nums2[j]:
 7                 nums1[k] = nums2[j]
 8                 j -= 1
 9             else:
10                 nums1[k] = nums1[i]
11                 i -= 1
12             k -= 1
13         while(j >= 0):    #如果nums2没有被遍历完
14             nums1[j] = nums2[j]
15             j -= 1

时间复杂度O(m+n),空间复杂度O(1)

 

上一篇:模拟读取CSV数据文件,查找标题行和数据行


下一篇:配合php的伪协议利用文件包含漏洞