[leecode] 合并两个有序数组
[leecode] 合并两个有序数组
- 问题
- 试图解答
问题
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 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]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
试图解答
看到题的时候,我脑内:“啊这,这不就是前几天学的归并排序吗,大概是非递归版?”
第一版提交代码如下:
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] 合并两个有序数组相关推荐
- 两个数组合并排序python_python算法题---合并两个有序数组
leetcode-python-合并两个有序数组 今天第一次电话面试,有点紧张,所以自己感觉表现的不是很好,面试过程中面试官问到了两个算法题,都是leecode上面的题目,而且我都做过,但是当时一下子 ...
- 数组-合并两个有序数组(双指针,从后往前)
题意: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...
- LeetCode-双指针-88. 合并两个有序数组
88. 合并两个有序数组 思路:归并排序,一长一短,肯定会有一个先放完,放完后把另一个拷贝过去即可. 为了避免覆盖所以从最后开始向前放最大的元素 class Solution {public:void ...
- LeetCode 88合并两个有序数组89格雷编码
微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...
- 合并两个无序数组java_88. 合并两个有序数组
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2的 ...
- 合并两个有序数组(双/三指针)
今天写作业,合并两个有序数组a和b,时间复杂度要求O(n),空间复杂度要求O(1). 很快想到创建第三个数组c,用双指针初始化指向a和b的头元素,每次选择较大者在c上尾插进去之后,再后移相对应a或者b ...
- 双指针:88. 合并两个有序数组
题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序,时间复杂度为O((n+m)log(n+m)) 代码: 快排详解 class Solution {public void merge( ...
- LeetCode 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
- 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
最新文章
- java如何实现成绩排序,小实例-实现对成绩总分由高到低的排序-Java中数组对象的排序...
- 10 分钟快速入门海量数据搜索分析引擎 Elasticearch
- 剑指offer 替换空格
- extjs入门(06) 按钮占两行
- codeforces 483B Friends and Presents 解题报告
- 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式
- zz 跟风小结一下孕期~
- 拉取远程分支到本地分支_想买的保险本地没有分支机构怎么办?异地投保理赔难吗?...
- Aria2 基础配置及下载设置
- lan和adsl是什么信号_光纤、以太网、ADSL上网有什么区别?
- Python~numpy.random.seed()方法
- 逻辑回归基本流程及鸢尾花项目实战
- html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...
- Handle机制详解
- char* strlen()学习
- 【mac】禁用烦人的系统快捷键(⌘M、 ⌘H....)
- WebRTC初学Demo
- 《曾有一个人 爱我如生命》——普希金诗词
- 用爬虫在网站上无限制的批量爬取图片
- PPP-RTK服务端卫星钟差估值性能分析
热门文章
- 【总结】1409- 深入浅出 npm yarn pnpm 包管理机制
- 极智AI | 谈谈昇腾 CANN AIPP
- RC滤波器与其数字实现方法
- 每日一句(July)
- Kerberoast/Kerberoasting:攻击与检测
- 内蒙古职高计算机专业可以考哪些大学,职高可以考的大学名单 职高考大学可以学什么专业...
- spring的延迟加载介绍
- 远程桌面连接时打不开计算机等,为什么远程连接连不上(远程桌面开启方法与无法连接解决办法)...
- python 操作PDF文件 之 A3页面转A4
- 话题编程与服务编程结合_编程的第四个十年:更大的盒子,更少的话题