leetcode 88 合并两个有序数组

这篇具有很好参考价值的文章主要介绍了leetcode 88 合并两个有序数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述:

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

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

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

解法:双数组的双指针遍历

算法思路分析:

整体过程分三步:

  • 开一个 m + n 的数组,合并两个有序数组到新开辟的数组内,然后将新开辟的数组拷贝到原数组中。主要的难点就是如何合并两个有序数组。
  • 由于两个数组都是非递减的,因此两个数组的首元素一定是它们所处的数组的最小值。那么,我们每一次合并的时候,仅需比较两个数组的首元素,谁最小,谁就是当前所有元素中最小的元素。
  • 然后将最小的元素添加到开辟的数组中,并且把最小的元素从原数组中去掉就可以了。

算法流程:

  • 开辟一个大小为** m + n** 的数组 ret。
  • 初始化三个指针,cur1 = 0, cur2 = 0, dest = 0 分别指向 nums1,nums2,ret 的首元素。
  • 当 cur1 < m 并且 cur2 < n 时,一直循环下述过程:
  • (思考结束条件:因为我们每次只取出某一个数组中的一个元素,因此,一定有一个数组会先被遍历完,而此时剩下的一个数组的内容,我们只用原封不动的拷贝到 ret 数组中即可。因此,结束条件就是 cur1 或者 cur2 任意一个指针遍历到数组结束位置)
  • 比较 nums1[cur1] 与 nums2[cur2] 的大小,分为下面三种:
  • nums1[cur1] < nums2[cur2];说明 nums1[cur1] 是最小的元素,将其放到 ret 数组中,并且让 cur1++(相当于去掉当前元素),dest++(指向下一个元素的位置),因此可以这样写:ret[dest++] = nums1[cur1++];
  • nums1[cur1] = nums2[cur2];因为此时两个数相等,我们让其中任意一个元素加入到** ret** 数组中均可,因此可以并到上述情况中;
  • nums1[cur1] > nums2[cur2];说明** nums2[cur2]** 是最小的元素,同理可得 ret[dest++] = nums2[cur2++];
  • 处理没有遍历完的数组
  • 将没有遍历完的数组全部拷贝到 ret 数组中即可
  • 不要忘记将 ret 数组的内容再拷贝到原数组中去

最后整理代码为:文章来源地址https://www.toymoban.com/news/detail-435112.html

#include <stdio.h>
#include <stdlib.h>

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    // 开辟一个新数组,用来存放合并后的结果
    int* ret = (int*)malloc(sizeof(int) * (m + n));
    // 初始化三个指针,用来遍历三个数组
    int cur1 = 0, cur2 = 0, dest = 0;

    // 当其中一个遍历到数组的结尾,我们就结束循环
    while (cur1 < m && cur2 < n)
    {
        // 当第一个数组的元素比较小的时候,我们就加入合并后的数组
        if (nums1[cur1] <= nums2[cur2])
            ret[dest++] = nums1[cur1++];
        // 否则就将第二个元素加入到目标数组
        else
            ret[dest++] = nums2[cur2++];
    }

    // 下面两个循环只会执行一个,因为只会有一个数组还有剩余元素
    // 当第一个数组的元素有剩余的话,就会执行第一个循环
    while (cur1 < m)
        ret[dest++] = nums1[cur1++]; // 将数组的内容拷贝到合并后的数组中
    // 当第二个数组的元素有剩余的话,就会执行第二个循环
    while (cur2 < n)
        ret[dest++] = nums2[cur2++];

    // 将合并后的数组,放回第一个数组中去
    for (int i = 0; i < m + n; i++)
    {
        nums1[i] = ret[i];
    }

    // 释放辅助数组
    free(ret);
}

到了这里,关于leetcode 88 合并两个有序数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​LeetCode解法汇总88. 合并两个有序数组

    https://github.com/September26/java-algorithms 给你两个按  非递减顺序  排列的整数数组  nums1   和  nums2 ,另有两个整数  m  和  n  ,分别表示  nums1  和  nums2  中的元素数目。 请你  合并   nums2   到  nums1  中,使合并后的数组同样按  非递减顺序  排列。 注意: 最终,合并

    2024年02月12日
    浏览(45)
  • LeetCode面试算法-力扣 88. 合并两个有序数组

    88. 合并两个有序数组 题目描述     给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由函数返回,而是存储

    2024年02月10日
    浏览(49)
  • LeetCode-Java:88合并两个有序数组

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况

    2024年02月05日
    浏览(53)
  • 88. 合并两个有序数组、Leetcode的Python实现

    博客主页:🏆李歘歘的博客 🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是     Leetcode  88. 合并两个有序数组        ⛽️💻💻💻

    2024年02月06日
    浏览(54)
  • 力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 88. 合并两个有序数组 首先创建一个临时数组,其大小为第一个数组的大小(即nums1Size),其作用主要是。 通过循环遍历两个数组,将两个数组元素比较后较

    2024年02月04日
    浏览(51)
  • 算法leetcode|88. 合并两个有序数组(rust重拳出击)

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意 :最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况

    2024年02月05日
    浏览(48)
  • 27.移除元素+88.合并两个有序数组

    目录 一、移除元素 (一)题目 (二)代码  二、合并两个有序数组 (一)题目 (二)代码 27. 移除元素 - 力扣(LeetCode)     88. 合并两个有序数组 - 力扣(LeetCode)    用双指针  

    2023年04月14日
    浏览(41)
  • 力扣每日一题88:合并两个有序数组

    给你两个按  非递减顺序  排列的整数数组  nums1   和  nums2 ,另有两个整数  m  和  n  ,分别表示  nums1  和  nums2  中的元素数目。 请你  合并   nums2   到  nums1  中,使合并后的数组同样按  非递减顺序  排列。 注意: 最终,合并后数组不应由函数返回,而是存储在

    2024年02月07日
    浏览(47)
  • 【力扣每日一题】88. 合并两个有序数组 &双指针 & 辅助数组 & 8.13打卡

    88. 合并两个有序数组 难度: 简单 描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而

    2024年02月09日
    浏览(41)
  • LeetCode 0088. 合并两个有序数组

    力扣题目链接:https://leetcode.cn/problems/merge-sorted-array/ 给你两个按 非递减顺序 排列的整数数组  nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包