88.合并两个有序数组

部署运行你感兴趣的模型镜像

题目

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

说明:
初始化 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]

解题思路

一个是合并后直接排序,python3中的sorted()和list.sort()都很好用
二是用双指针遍历需要合并的数组,选出最小值放入输出数组

解法一:合并排序

题目是原地修改,用list.sort()更符合题意

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.
        """
        nums1[:]=nums1[:m]+nums2
        nums1[:]=sorted(nums1)
        ///nums1[:]=sorted(nums1[:m]+nums2)
        #修改数组本身要用list[:],直接用list会出错
        #错误示例        nums1=nums1[:m]+nums2
        #               nums1=sorted(nums1)

解法二:双指针,从前往后/从后往前

因为要访问nums1中前m个元素,所以使用从前往后的方法时,需要将nums拷贝一份防止覆盖丢失,(找出最小值)
而从后往前就可以利用nums1中没有利用的空间,达到减少内存的目的(找出最大值)

  #从后往前
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.
        """
        p1 = m - 1
        p2 = n - 1
        p = m + n - 1
        # 双指针及数组最大容量
        
        while p1 >= 0 and p2 >= 0:
            if nums1[p1] < nums2[p2]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] =  nums1[p1]
                p1 -= 1
            p -= 1
        
        # add missing elements from nums2
        nums1[:p2 + 1] = nums2[:p2 + 1]

作者:LeetCode
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#从前往后
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.
        """
        # 拷贝nums1
        nums1_copy = nums1[:m] 
        nums1[:] = []

        p1 = 0 
        p2 = 0

        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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

### 合并两个有序数组算法实现 #### 使用 Java 自带排序方法 一种简单的方法是利用编程语言内置的排序功能。这种方法虽然直观易懂,但在效率上并非最优。 ```java import java.util.Arrays; public class ArrayMerge { public static void main(String[] args) { int[] nums1 = new int[]{1, 2, 3, 0, 0, 0}; int m = 3; int[] nums2 = new int[]{2, 5, 6}; int n = 3; // 将第二个数组元素复制到第一个数组后面未填充的位置 for (int i = 0; i < n; i++) { nums1[m + i] = nums2[i]; } // 对整个数组进行排序 Arrays.sort(nums1); // 打印结果 for (int num : nums1) { System.out.print(num + " "); } } } ``` 此代码片段展示了如何通过先合并再排序的方式完任务[^3]。 #### 双指针法(正向) 为了提高性能,可以采用双指针策略,在遍历过程中比较两数组当前最小值并将较小者放入新位置。这种方式避免了不必要的重复排序操作。 ```python def merge_sorted_arrays(nums1, m, nums2, n): index1, index2 = m - 1, n - 1 write_index = m + n - 1 while index2 >= 0: if index1 >= 0 and nums1[index1] > nums2[index2]: nums1[write_index] = nums1[index1] index1 -= 1 else: nums1[write_index] = nums2[index2] index2 -= 1 write_index -= 1 return nums1 ``` 这段 Python 代码实现了从后向前逐步构建最终序列的过程[^4]。 #### 特殊情况处理 当其中一个输入为空时,实际上无需任何动作即可满足题目要求;而另一个极端情况下即 `m` 或 `n` 为零,则意味着只需要保留非空的那个列表作为输出即可[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值