昨天腾讯一面上来就给我整的这道 easy 难度的题,然后我太紧张了还想了一会儿,差点炸裂。

题目链接

LeetCode 88. 合并两个有序数组[1]

题目描述

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

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 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]
解释:

题解

看到这道题,脑海里应该第一时间想到的是归并排序,但是归并排序需要一个额外的数组用来保存排序后的数组,这里不允许使用额外空间。

那么我们还是用归并排序的思路来做,试一下两个指针 i = 0j = 0 ,初始的时候分别指着 nums1[0]nums2[0] 。然后比较 nums1[i]nums2[j] 大小,如果 nums1[i] 更小,那么就放在原位不动它,然后 i += 1。如果 nums2[j] 更小,那么就交换 nums1[i]nums2[j] ,然后还是 i += 1。这么看貌似可行哦?但是最终一定会先遍历完 nums1,然后 j 还是停留在 0 ,然后你会发现 nums2 中的数字还是乱序的,根本没法处理。

那么怎么利用上 nums1 后面多出的那么多空位呢?我们可以换个思路,从最大的开始遍历。两个指针初始的时候 i = m-1j = n-1 ,然后将较大值填充到 nums1 的最后面。最后如果 nums2 中还有剩余,就依次填充到 nums1 最前面就行了。

这样为什么就可以了呢?因为如果从小到大遍历的话,元素会覆盖掉 nums1 中还没遍历的元素。但是从大到小是填充到尾部,就不会产生覆盖。就算极限情况下 nums2 中元素全部大于 nums1 中元素,也不会覆盖到 nums1 的最后一个元素。

面试官最后还会问你有啥优化,我当时图省事,最后还把 nums1 中剩下元素填充到 nums1 最前面了,其实完全没有必要,本来就是有序的,等于没有做事。

代码

c++

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

python

        class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:i, j = m-1, n-1while i >= 0 and j >= 0:if nums1[i] > nums2[j]:nums1[i+j+1] = nums1[i]i -= 1else:nums1[i+j+1] = nums2[j]j -= 1while j >= 0:nums1[j] = nums2[j]j -= 1

参考资料

[1]

LeetCode 88. 合并两个有序数组: https://leetcode-cn.com/problems/merge-sorted-array/

【每日算法Day 96】腾讯面试题:合并两个有序数组相关推荐

  1. 如歌将两个数组合并_腾讯50题---合并两个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...

  2. 中数组的合并_【美团面试题】合并两个有序数组

    [美团面试题]合并两个有序数组 题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 划重点 初始化 nums1 和 ...

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

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

  4. 【每日一算法】合并两个有序数组

    每日一算法-搜索插入位置 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...

  5. 算法-----数组------合并两个有序数组

    首先,恭喜自己,写的解决改算法的代码,是所有java里面执行最快的. 自己辛苦练习了一周多的数组算法题,终于写出了最优的解决方案.虽然方法有点笨,没有别人写的简单,但是仍然值得鼓励.. 给定两个有序整 ...

  6. 双指针算法(四):力扣 88.合并两个有序数组 | 经典例题

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

  7. 【Leetcode数据结构算法题】合并两个有序数组(顺序表篇)

    题目内容: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2中的元素数目. 请你 合并 nums2 到 nums1 ...

  8. leetcode算法题--合并两个有序数组

    原题链接:https://leetcode-cn.com/problems/merge-sorted-array/ 尾部双指针 void merge(vector<int>& nu ...

  9. 面试题 合并两个有序链表

    这道题常规解法有两种,可能还有其它. 解法1,设置指针 i, j 分别指向两个链表,比较 i, j 大小,小的先挂到新链表上,然后移动指针继续比较,直到某个链表走到最后,这时候把另一个链表剩余的全挂过 ...

  10. 【数据结构与算法】之深入解析“合并两个有序数组”的求解思路与算法示例

    一.题目描述 给你两个按"非递减顺序"排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目,请合并 nums2 ...

最新文章

  1. Android零基础入门第77节:Activity任务栈和启动模式
  2. 软件工程作业No.5
  3. 从C语言的角度重构数据结构系列(五)-C语言的程序结构和基本语法
  4. android contacts电话查询头像,android怎么取得本地通讯录的头像的原图
  5. 汇编语言王爽第二版-课后答案以及解析
  6. 性能测试篇 :Jmeter监控服务器性能
  7. java单行字符_十个便捷的单行代码编程技巧
  8. jdk、cglib动态代理代码示例
  9. c语言while跳不出来,这个while循环终止了却跳不出来为什么
  10. Entity Framework之IQueryable和list本地集合
  11. android app wifi密码,手机WiFi密码显示APP
  12. linux两台设备网桥配置,Linux网桥配置
  13. 谭浩翔c语言,严谨细致的科技尖兵丨广州市公安局黄埔区分局民警谭浩翔
  14. 光谱数据预处理方法之去除包络线——Matlab实现
  15. 数学建模及数据分析上的插值处理——第三部分实践插值实战
  16. C语言练习之温度转换
  17. 【Java】Java中文分词器Ansj的使用
  18. 图文讲解三极管3种工作状态
  19. HCIE 面试 ----- 组播
  20. mysql table crashed_mysql Table Crashed

热门文章

  1. JNI_OnLoad
  2. 【linux】make出现遗漏分隔符
  3. [No0000123]WPF DataGrid Columns Visibility的绑定
  4. java:高速排序算法与冒泡排序算法
  5. 福州大学 Problem 2169 shadow
  6. 工具开发:勿以善小而不为
  7. 第二节: 外部中断学习(用CubeMX学习STM32)
  8. 5、lvs使用进阶(01)
  9. 机器学习(Andrew Ng)作业代码(Exercise 1~2)
  10. 如何使用JSTL及JSTL标签库