Leetcode 88:合并两个有序数组
Leetcode链接 : https://leetcode-cn.com/problems/merge-sorted-array/
问题描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
解题思路:
数组一次遍历法:即反向遍历两个数组,每次获取两数组中的最大值,并按逆序在nums1中填充 ,程序时间复杂度O(m+n),空间复杂度O(1)。
解题步骤:
- 建立整型变量i , j 表示当前nums1和nums2的位置点,起始位置i=m-1, j=n-1
- 建立整型变量k,表示在num1中插入值的位置,起始位置m+n=1
- 比较num1[ i ]<nums2[ j ]是否成立,成立则nums1[ k ]=nums2[ j ],k=k-1,j=j-1 ; 否则nums1[ k ]=nums1[ i ],k=k-1,i=i-1 ;
- 直到 num1 或 num2 全部遍历完,若num2先遍历完,则此时 num1 已经全部有序。若num1先遍历完,则将num2中剩余的k个元素仍有序,将他们依次插入nums1中的0~k-1位置,程序结束。
若对过程仍不理解,请结合以下程序执行图进行理解,假设有两个数组为
nums1 = [1,4,7,0,0,0], nums2 = [2,5,8]
则程序执行过程如图所示:
该问题本质是寻找到当前剩余所有元素中的最大值然后插入nums1中,直到所有元素全部插完。
该问题C++实现代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-;
int j=n-;
int k=m+n-;
while(i>= && j>=){
if(nums1[i]<=nums2[j]){
nums1[k]=nums2[j];
j--;
k--;
}else{
nums1[k]=nums1[i];
i--;
k--;
}
}
while(j>=){
nums1[k]=nums2[j];
k--;
j--;
}
}
};
结束语:
此问题虽然只是一个简单的数组合并题,但仍有一些小的trick可供思考。因为本题要求的是原地插入nums1中,为何此处大小判别条件为:nums1[i]<=nums2[j],而不是nums1[i]<nums2[j],这两种条件都能保证程序输出正确的结果,这里卖个关子,希望有心的读者可以思考一下。
作图码字不易,如果对您有帮助,欢迎点击推荐关注(狗头)。。。
Leetcode 88:合并两个有序数组的更多相关文章
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- Leetcode 88 合并两个有序数组 Python
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...
- LeetCode 88. 合并两个有序数组
题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- LeetCode 88. 合并两个有序数组(Merge Sorted Array)
题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- [LeetCode每日一题]88. 合并两个有序数组
[LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...
- 【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 知识点:数组:排序:双指针: 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 ...
- leetcode.双指针.88合并两个有序数组-Java
1. 具体题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别 ...
- leetcode刷题-88.合并两个有序数组
题目 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- 领扣(LeetCode)合并两个有序数组 个人题解
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...
- 【LeetCode】合并两个有序数组
[问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
随机推荐
- JDK10源码分析之HashMap
HashMap在工作中大量使用,但是具体原理和实现是如何的呢?技术细节是什么?带着很多疑问,我们来看下JDK10源码吧. 1.数据结构 采用Node<K,V>[]数组,其中,Node< ...
- [20190909]完善vim的bccacl插件.txt
[20190909]完善vim的bccacl插件.txt http://blog.itpub.net/267265/viewspace-2140886/http://blog.itpub.net/26 ...
- [PHP] 运维新增服务器导致的附件上传失败问题
现象:客服反馈webmail发信上传附件时,报错提示上传失败,发信时提示发送失败前因:运维同事新增加了三台服务器 1.服务器上有一个挂载的公共目录,该目录是存储的上传后的附件文件.该路径是通过一个软链 ...
- Shell命令-搜索文件或目录之which、find
文件及内容处理 - which.find 1. which:查找二进制命令,按环境变量PATH路径查找 which命令的功能说明 which 命令用于查找文件.which 指令会在环境变量 $PATH ...
- mysql里字符集的配置
[client]default-character-set=utf8[mysqld]character-set-server = utf8[mysql]default-character-set=ut ...
- 初学JavaScript正则表达式(六)
JavaScript预定义类 ab+数字+任意字符 ab[0-9][^\r\n] 等价于 ab\d. '@123@abc@'.replace(/@./g,'Q') Q23Qbc@ 将"@加任 ...
- 【转】ServletContext介绍及用法
1.1. 介绍 ServletContext官方叫servlet上下文.服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象.这个对象全局唯一,而且工程内部的所有servl ...
- 【转】UML各种图总结
UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以及各 ...
- Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting 水题
C. Array Splitting You are given a sorted array
- poi实现excel数据的导入和导出
内容来源于网络,侵删. 1.需要的jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactI ...