• LeetCode #88.合并两个有序数组


    力扣 | 88.合并两个有序数组

    题目截图

    方法一:直接合并然后排序

    利用python的切片让数组nums1的从m到m+n个 位置赋值为数组nums2的元素,然后对nums1的元素排序。

    复杂度

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

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

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. nums1[m:m+n] = nums2
    7. nums1.sort()

    完整测试代码

    1. from typing import List
    2. class Solution:
    3. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    4. """
    5. Do not return anything, modify nums1 in-place instead.
    6. """
    7. nums1[m:m+n] = nums2
    8. nums1.sort()
    9. class main:
    10. a = Solution()
    11. num1 = [1, 2, 3, 0, 0, 0]
    12. m = 3
    13. nums2 = [2, 5, 6]
    14. n = 3
    15. b = a.merge(num1, m, nums2, n)
    16. print(num1)
    17. if __name__ == '__main__':
    18. main()

    方法二:双指针 

    方法一没有利用数组为“非递减排序”的性质。可以创建一个新的数组,然后两个指针分别指向原数组nums1和nums2,相互比较大小后存入新数组,最后将新数组的元素赋值给原数组nums1。

    复杂度

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

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

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. sorted_nums = []
    7. p1, p2 = 0, 0
    8. while p1 < m or p2 < n:
    9. if p1 == m:
    10. sorted_nums.append(nums2[p2])
    11. p2 += 1
    12. elif p2 == n:
    13. sorted_nums.append(nums1[p1])
    14. p1 += 1
    15. elif nums1[p1] < nums2[p2]:
    16. sorted_nums.append(nums1[p1])
    17. p1 += 1
    18. else:
    19. sorted_nums.append(nums2[p2])
    20. p2 +=1
    21. nums1[:] = sorted_nums

    方法三:逆向双指针

    方法二需要使用临时变量sorted_nums,因为在合并数组的过程中,数组nums1中的元素可能会被新加入的元素覆盖,导致结果错误。但是数组nums1的后半段是空的,可以让指针从后往前遍历。

     

    复杂度

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

    空间复杂度:O(1)

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. p1, p2 = m-1, n-1
    7. p3 = m+n-1
    8. while p1 >=0 or p2 >= 0:
    9. if p1 == -1:
    10. nums1[p3] = nums2[p2]
    11. p2 -= 1
    12. elif p2 == -1:
    13. nums1[p3] = nums1[p1]
    14. p1 -= 1
    15. elif nums1[p1] > nums2[p2]:
    16. nums1[p3] = nums1[p1]
    17. p1 -= 1
    18. else:
    19. nums1[p3] = nums2[p2]
    20. p2 -=1
    21. p3 -= 1

     

  • 相关阅读:
    分布式数据库难题(四):单机事务
    通配符、别名
    Mysql集群及高可用-半同步模式(AFTER_SYNC)4
    Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件)
    Python机器视觉--OpenCV入门--OpenCV鼠标绘制图形
    初次选购云服务器宽带如何选择?3M够吗?
    【C++】MyString
    Viterbi维特比译码误码率仿真,调制为QPSK,信道为高斯白噪声
    SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
    java写一个用于生成雪花id的工具类
  • 原文地址:https://blog.csdn.net/weixin_42112343/article/details/126058862