LeetCode 88. 合并两个有序数组 Merge Sorted Array

Table of Contents

一、中文版

二、英文版

三、My answer

四、解题报告


一、中文版

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

 

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
 

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

二、英文版

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:

The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:

Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

Output: [1,2,2,3,5,6]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

三、My answer

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.
        """
        l = m + n
        while m > 0 and n > 0:
            if nums1[m-1] > nums2[n-1]:
                nums1[l-1] =  nums1[m-1]
                m -= 1
            else:
                nums1[l-1] = nums2[n-1]
                n -= 1
            l -= 1
        
        if n > 0:
            for i in range(n):
                nums1[i] = nums2[i]
        print(nums1)
        return nums1
"""
[1,2,3,0,0,0]
3
[2,5,6]
3
[1,2,0,0,0]
2
[2,5,6]
3
[2,5,6,0,0,0]
3
[1,2,3]
3
[2,5,6,0,0,0]
3
[5,7]
2
"""

四、解题报告

代码中注释部分是测试用例,LeetCode中我比较喜欢的一点就是可以同时测试多个,目前 lintcode 还不支持。

本算法算是一种逆向思维 —— 从后往前填满数组,而不是从前往后排,因为这样会遍历和移动多次数据,而从后往前只需要遍历 nums1 nums2 各一次。

比较 nums1 nums2 的数,谁大就放在所需位置,并向前移动一位指针。

如果最后剩的是 nums1 没遍历完,即 nums2 已全部插入 nums1 中,则不需要做任何操作,因为本来就是在 nums1 中的,剩下没遍历到的也是 nums1 的数。

但如果是剩的是 nums2,则说明原来的 nums1 已不在原位,需要把剩余的 nums2 的数填补到 nums1 的开头(因为从后往前遍历,剩下的位置是靠前的位置.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值