1.原题目

Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.

比如

int a[11] = {1,2,3,4,5};
int b[6] = {3,4,5,6,7,8};

要得到a[11] = {1,2,3,3,4,4,5,5,6,7,8}

2.归并排序的其中一步

第一感觉这个题目比较简单,就是归并排序中的其中一步:

需要一个tmp数组,初始化两个int 作为指示器,分别指向a数组的第一个元素和b数组的第一个元素。

然后比较a数组和b数组的当前元素,谁比较小谁就放入tmp数组。完了后移向下一个元素。这样操作直到a指示器大于a数组长度或者b指示器大于b数组长度。

然后看a数组和b数组,谁还剩下元素就把谁全部复制到tmp数组中。

tmp数组就是最终的有序数组。

void merge(int A[], int m, int B[], int n) {int aIndex, bIndex,tmpIndex;aIndex = bIndex = tmpIndex = 0;int* tmp = new int[m + n];while(aIndex < m && bIndex < n){if(A[aIndex] <= B[bIndex]){tmp[tmpIndex++] = A[aIndex++];}else{tmp[tmpIndex++] = B[bIndex++];}}//如果a数组还有剩下,就复制a的到tmpwhile(aIndex < m){tmp[tmpIndex++] = A[aIndex++];}//如果b数组还有剩下,就复制b的到tmpwhile(bIndex < n){tmp[tmpIndex++] = B[bIndex++];}//最后再把tmp复制到a数组for(int i = 0; i < m + n; ++i){A[i] = tmp[i];}delete tmp;
}

3.为什么需要一个额外的tmp数组?

脑子被归并排序给先入为主弄傻了。因为归并排序是对一个数组进行操作,往往需要一个额外的数组来存储。这道题目中,a数组空间比较大,可以直接用a

换个思路,

初始化两个int 作为指示器,分别指向a数组的最后一个元素和b数组的最后一个元素。

然后比较大小,较大的放入a数组的末端。这样不断往前走。直到a数组用完或者b数组用完。

如果a数组先用完,那么就把b数组剩下的所有元素复制到a的前半部分,如果b数组先用完,那么a数组已经是一个有序的数组。

void merge(int A[], int m, int B[], int n) {int larstAIndex = m - 1;int larstBIndex = n - 1;int currentIndex = m + n - 1;while(larstAIndex >= 0 && larstBIndex >= 0){if(A[larstAIndex] >= B[larstBIndex]){A[currentIndex--] = A[larstAIndex--];}else{A[currentIndex--] = B[larstBIndex--];}}while(larstBIndex >= 0){A[currentIndex--] = B[larstBIndex--];}}

Merge Sorted Array 合并两个有序数组

Merge Sorted Array 合并两个有序数组相关推荐

  1. LeetCode in Python-21. Merge Two Sorted Lists 合并两个有序链表

    Merge Two Sorted Lists 合并两个有序链表 题目 解法1. 解法2. 出处 题目 解法1. # Definition for singly-linked list. # class ...

  2. Leetcode-D33-数组-66. 加一88. 合并两个有序数组

    一.复习 移除元素-双指针问题,一个指针用来记录下一个扫描哪个元素:另一个指针用来记录下一个写哪里 搜索插入位置-二分法,不断与中间位置的数字比较大小值,缩小区间范围:当两侧只差一个单位时,看val是 ...

  3. 数组-合并两个有序数组(双指针,从后往前)

    题意: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...

  4. LeetCode-双指针-88. 合并两个有序数组

    88. 合并两个有序数组 思路:归并排序,一长一短,肯定会有一个先放完,放完后把另一个拷贝过去即可. 为了避免覆盖所以从最后开始向前放最大的元素 class Solution {public:void ...

  5. LeetCode 88合并两个有序数组89格雷编码

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  6. 合并两个无序数组java_88. 合并两个有序数组

    88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2的 ...

  7. 合并两个有序数组(双/三指针)

    今天写作业,合并两个有序数组a和b,时间复杂度要求O(n),空间复杂度要求O(1). 很快想到创建第三个数组c,用双指针初始化指向a和b的头元素,每次选择较大者在c上尾插进去之后,再后移相对应a或者b ...

  8. 双指针:88. 合并两个有序数组

    题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序,时间复杂度为O((n+m)log(n+m)) 代码: 快排详解 class Solution {public void merge( ...

  9. 88. 合并两个有序数组 golang

    88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...

最新文章

  1. Hashing散列注意事项
  2. Android添加权限大讲解
  3. idea中如何reimport_IDEA中导入新项目遇坑
  4. python必背内容-【经验分享】学Python必背的初级单词
  5. Java编程中“为了性能”需做的26件事(转)
  6. 微服务网关 Kong 科普
  7. Win10安装Vue-cli
  8. 朴素贝叶斯 半朴素贝叶斯_使用朴素贝叶斯和N-Gram的Twitter情绪分析
  9. C 语言实例 - 斐波那契数列
  10. lambda表达式可以用来声明_lambda表达式可以用来创建包含多个表达式的匿名函数...
  11. C# AE缓冲区分析 (转)
  12. 测试回归结果分析软件,“3414”试验数据分析软件设计原理
  13. pde中微元分析法的主要思想_有限元法(FEM)
  14. 怎么下载高清无水印的视频号作品?视频号下载要用什么工具?1分钟解决微信视频号下载
  15. 如何在A4纸上排版多个二维码?
  16. 什么是独享锁/共享锁_java培训
  17. 英文版本Ubuntu下添加中文拼音输入法: Chinese (Intelligent Pinyin)
  18. 声音传感器模块的改进
  19. 笔试 | 大疆2021秋招笔试题及题解
  20. 常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序

热门文章

  1. 用批处理读取特定注册表项的路径值
  2. redis的简单安装和配置文件的参数
  3. WindowsServices_无法拷贝文件到服务器
  4. win7登录密码破解工具
  5. 计算机学习路线推荐(初稿)
  6. [合作] 钢结构结构健康监测研究与实验
  7. ubuntu14安装tensorflow并测试
  8. 如何使用 volatile, synchronized, final 进行线程间通信
  9. 搭建Nginx+PHP环境
  10. hdu 4196(数论)