[leecode] 合并两个有序数组

  • 问题
  • 试图解答

问题

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

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例 1:

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

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

提示:

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

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

试图解答

看到题的时候,我脑内:“啊这,这不就是前几天学的归并排序吗,大概是非递归版?”
第一版提交代码如下:

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int i=0,j=0,num=0;while(j<n&&i<m){if (nums1[i+j]>nums2[j]){for(int k=m+j;k>i+j;k--){nums1[k]=nums1[k-1];}nums1[i+j]=nums2[j];j++;}else{i++;}}while(j<n){nums1[i+j]=nums2[j];j++;}}
};

然后解析界面发现这不是最快的,思考了一下,是每次插入nums2的时候的循环拖了速度.
用空间换时间后,代码如下:

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {short i = 0, j = 0, num = 0;while (j < n && i < m) {if (j + num < n&&(nums1[i + j] > nums2[j + num])){num++;}else {if (num) {for (short k = m + j + num - 1; k > i + j + num - 1; k--) {nums1[k] = nums1[k - num];}while (num) {nums1[i + j] = nums2[j];j++;num--;}}i++;}}while (j < n) {nums1[i + j] = nums2[j];j++;}}
};

但是这次提交的时候leecode的测试数据换成了如下数据

[2,0]
1
[1]
1

这样的小数据反而这么多if和循环判断的代码运行起来没有优势了,所以实际上还是可以优化的,直接把参数m和n用起来,从尾部开始倒序插入排列,避免了数据的移动和计数的空间消耗,一旦n==0了就代表排序结束了.
代码如下:

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {while (m && n){if (nums1[m-1] > nums2[n-1]){nums1[m + n-1] = nums1[m-1];m--;}else{nums1[m + n-1] = nums2[n-1];n--;}}while(n){nums1[m + n-1] = nums2[n-1];n--;}}
};

但是这样leecode反而表示我内存实际上比上两个代码多用了1m,只能说不是很懂原理

[leecode] 合并两个有序数组相关推荐

  1. 两个数组合并排序python_python算法题---合并两个有序数组

    leetcode-python-合并两个有序数组 今天第一次电话面试,有点紧张,所以自己感觉表现的不是很好,面试过程中面试官问到了两个算法题,都是leecode上面的题目,而且我都做过,但是当时一下子 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. LeetCode 88. 合并两个有序数组 golang

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

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

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

最新文章

  1. java如何实现成绩排序,小实例-实现对成绩总分由高到低的排序-Java中数组对象的排序...
  2. 10 分钟快速入门海量数据搜索分析引擎 Elasticearch
  3. 剑指offer 替换空格
  4. extjs入门(06) 按钮占两行
  5. codeforces 483B Friends and Presents 解题报告
  6. 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式
  7. zz 跟风小结一下孕期~
  8. 拉取远程分支到本地分支_想买的保险本地没有分支机构怎么办?异地投保理赔难吗?...
  9. Aria2 基础配置及下载设置
  10. lan和adsl是什么信号_光纤、以太网、ADSL上网有什么区别?
  11. Python~numpy.random.seed()方法
  12. 逻辑回归基本流程及鸢尾花项目实战
  13. html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...
  14. Handle机制详解
  15. char* strlen()学习
  16. 【mac】禁用烦人的系统快捷键(⌘M、 ⌘H....)
  17. WebRTC初学Demo
  18. 《曾有一个人 爱我如生命》——普希金诗词
  19. 用爬虫在网站上无限制的批量爬取图片
  20. PPP-RTK服务端卫星钟差估值性能分析

热门文章

  1. 【总结】1409- 深入浅出 npm yarn pnpm 包管理机制
  2. 极智AI | 谈谈昇腾 CANN AIPP
  3. RC滤波器与其数字实现方法
  4. 每日一句(July)
  5. Kerberoast/Kerberoasting:攻击与检测
  6. 内蒙古职高计算机专业可以考哪些大学,职高可以考的大学名单 职高考大学可以学什么专业...
  7. spring的延迟加载介绍
  8. 远程桌面连接时打不开计算机等,为什么远程连接连不上(远程桌面开启方法与无法连接解决办法)...
  9. python 操作PDF文件 之 A3页面转A4
  10. 话题编程与服务编程结合_编程的第四个十年:更大的盒子,更少的话题