[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 ...
最新文章
- 【Python】Python中令人头疼的变量作用域问题,终于弄清楚了
- IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码
- 如何在SAP S/4HANA Cloud系统里创建employee
- 二、数据库设计与操作
- input输入数字验证
- Windows下GIt入门试验配置教程单机版
- ios中生成uuid
- 修复 www.shouyela.com 造成的 IE 问题
- linux逻辑卷管理(LVM)
- JavaScript学习指南集锦
- 电脑白屏,“笔记本电脑开机白屏的原因和解决方法”的解决方案
- 第三届火焰杯软件测试初赛题目
- 修正逆解文章——六轴UR机械臂正逆运动学求解_MATLAB代码(标准DH参数表)
- 微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
- 计算机自培计划,个人年度自培计划
- GET POST 区别!别听他们扯犊子,越看越气人
- 微信小程序有什么商业价值?
- 最近使用git的错误----“failed to push some refs to ...”与“On branch master Your branch is up to date with ‘”
- 余江php,余江通报9起违纪案例,其中这个局竟然有8起
- Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战
热门文章
- 网络程序设计结课总结——神经网络篇
- Echarts 地图控件tooltip多行显示
- gdb openocd jlink arm-a9调试
- python量化实战 顾比倒数线_顾比倒数线的画法及使用条件详解
- Creator+微信小游戏(2):服务器远程加载资源(4M限制、socketio问题)
- 微信小程序+VUE食堂订餐点餐系统(含源码+论文+答辩PPT等)
- 基于微信小程序食堂订餐系统源码(微信小程序毕业设计)
- linux服务器开启远程连接不上,远程SSH连接服务与基本排错经验总结
- 图片可以转换成pdf吗?
- 用HTML实现简易版计算器