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 ...
随机推荐
- 原生js利用data选择元素
//js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...
- MySQL数据库(三)锁机制
MyISAM默认使用表级锁,不支持行级锁 InnoDB默认使用行级锁,也支持表级锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现 ...
- mssql sqlserver if exists 用法大汇总
摘要: 下文讲述sqlserver中,更新脚本中常用if exists关键字的用法说明,如下所示: 实验环境:sql server 2008 R2 一.检测数据库是否存在于当前数据库引擎下 if ex ...
- 18.Llinux-触摸屏驱动(详解)【转】
转自:https://www.cnblogs.com/lifexy/p/7628889.html 本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次 ...
- react的路由权限控制
在使用路由的时候,有的时候我们的界面只能够在登录之后才可以看的到,这个时候就需要使用路由权限控制了 找了资料发现一个就是我使用的方法,一个是高阶组件. 原谅菜鸟看不太懂不会使用高阶组件………… 首先在 ...
- 自己整理的模拟爬虫的user-agent
自己经常用的一些爬虫用的user-agent头部 This XML file does not appear to have any style information associated with ...
- 浅谈C++ STL vector 容器
浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...
- Python tempfile (临时文件)
Python tempfile 大量临时数据放在内存中会占用大量资源,可以使用临时文件来进行储存 临时文件不用命名,且使用后会被自动删除 TemporaryFile 使用 TemporaryFile ...
- Python网络编程基础 ❸ struct模块 基于upd的socket服务
struct模块 基于upd的socket服务
- git 关联vs code
{ "window.zoomLevel": 1, "editor.fontSize": 15, "gitlens.advanc ...