首页 > 其他分享 >[Leetcode] 0088. 合并两个有序数组

[Leetcode] 0088. 合并两个有序数组

时间:2023-10-23 16:59:08浏览次数:37  
标签:p1 int 复杂度 nums1 0088 数组 Leetcode nums2

88. 合并两个有序数组

题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

 

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

 

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

 

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

解法

方法一:直接合并后排序

最直观的方法是先将数组 \(\textit{nums}_2\)放进数组 \(\textit{nums}_1\)的尾部,然后直接对整个数组进行排序。

复杂度分析

时间复杂度:\(O((m+n)\log(m+n))\)。 排序序列长度为 \(m+n\),套用快速排序的时间复杂度即可,平均情况为 \(O((m+n)\log(m+n))\)。

空间复杂度:\(O(\log(m+n))\)。 排序序列长度为 \(m+n\),套用快速排序的空间复杂度即可,平均情况为 \(O(\log(m+n))\)。

方法二:双指针

方法一没有利用数组 \(\textit{nums}_1\)与 \(\textit{nums}_2\) 已经被排序的性质。为了利用这一性质,我们可以使用双指针方法。这一方法将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。

复杂度分析

时间复杂度:\(O(m+n)\)。 指针移动单调递增,最多移动 \(m+n\) 次,因此时间复杂度为 \(O(m+n)\)。
空间复杂度:\(O(m+n)\)。 需要建立长度为 \(m+n\) 的中间数组 \(\textit{sorted}\)。

Python3

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[m:] = nums2
        nums1.sort()
        print(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.
        """
        sorted = []
        p1,p2 = 0,0
        while p1 < m or p2 < n:
            if p1 == m:
                sorted.append(nums2[p2])
                p2 +=1
            elif p2 == n:
                sorted.append(nums1[p1])
                p1 +=1
            elif nums1[p1] < nums2[p2]:
                sorted.append(nums1[p1])
                p1 +=1
            else:
                sorted.append(nums2[p2])
                p2 +=1
        nums1[:] = sorted[:]

C++

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for (int i = 0; i != n; ++i) {
            nums1[m + i] = nums2[i];
        }
        sort(nums1.begin(), nums1.end());
    }
};
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = 0,p2 = 0;
        int sorted[m+n];
        int cur;
        while(p1<m || p2<n){
            if(p1==m)
                cur = nums2[p2++];
            else if(p2 ==n)
                cur = nums1[p1++];
            else if(nums1[p1] < nums2[p2])
                cur = nums1[p1++];
            else    
                cur = nums2[p2++];
            
            sorted[p1+p2-1] = cur;
        }
        for(int i=0;i<m+n;++i){
            nums1[i] = sorted[i];
            cout << nums1[i] << " ";
        }
        cout << endl;
    }
};

标签:p1,int,复杂度,nums1,0088,数组,Leetcode,nums2
From: https://www.cnblogs.com/yege/p/17782845.html

相关文章

  • [Leetcode] 0824. 山羊拉丁文
    824.山羊拉丁文题目描述给你一个由若干单词组成的句子 sentence,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。请你将句子转换为“山羊拉丁文(GoatLatin)”(一种类似于猪拉丁文 -PigLatin的虚构语言)。山羊拉丁文的规则如下:如果单词以元音开头('a','e','i',......
  • 从数组中删除假值
    您可以使用filter()来组合布尔值,以简化从数组中删除假值的过程。false值是将false视为条件的值,例如null、未定义、空字符串(“”或'')、0、NaN和false。Boolean是JavaScript的内置构造函数,它通过将值传递给它来将值转换为布尔值。在此示例中,布尔构造函数作为回调函数传......
  • [Leetcode] 0821. 字符的最短距离
    821.字符的最短距离题目描述给你一个字符串s和一个字符c,且c是s中出现过的字符。返回一个整数数组answer,其中answer.length==s.length且answer[i]是s中从下标i到离它最近的字符c的距离。两个下标 i和j之间的距离为abs(i-j),其中abs是绝......
  • 53. 最大子数组和
    链接https://leetcode.cn/problems/maximum-subarray/description/思路1.在线处理法:对于一个连续的序列来说,如果它小于0,那么它对于周围所有的数组都是减益效果。试想一下,任何数与负数相加,都小于它本身。根据此,可以用在线处理法,O(n)的时间即可搞定。2.动态规划法:这个题存在中......
  • 删除排序数组中的重复项 II
    删除排序数组中的重复项II分析设置两个指针一个跑全数组的,一个选择可被覆盖的位置因为是有序的,要保留n个就将慢指针往后推n个代码/***下面代码是保留两个*@param{number[]}nums*@return{number}*/varremoveDuplicates=function(nums){if(nums.le......
  • 删除有序数组中的重复项
    删除有序数组中的重复项分析设置两个指针一个跑全数组的,一个选择可被覆盖的位置判断两个数不同就覆盖,相同就前进代码varremoveDuplicates=function(nums){if(nums.length===0)return0;letfast=1,slow=1;while(fast<nums.length){if......
  • LeetCode 300. 最长递增子序列
    最长递增子序列题目链接:300.最长递增子序列题目描述:给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,......
  • LeetCode 376. 摆动序列
    最长递增子序列题目链接:376.摆动序列题目描述:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值......
  • 数组的特点
    数组的特点特点数组元素的类型必须一致,char类型与ACSII码表对应数组元素连续,空间大小一致,呈现线性结构数组长度一旦固定,不可改变,不仅可以存储基本数据类型,还可以存储引用数据类型,数组本身也是引用类型Stringstr={"1","2","3"}优点根据索引去访问元素能存......
  • 前端歌谣的刷题之路-第五十八题-删除数组的最后一个元素
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......