LeetCode系列之 (JavaScript) => 88. 合并两个有序数组
题目描述:

【Leetcode 题目链接】:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)
解题思路分析:
- 在nums1中找到nums2 插入的位置,然后在整体排序;
- 或采用合并排序的方式,逐个位置判断需要插入的元素(还要考虑循环方向,比如下面的第三种解法);
- 由于m,n的大小不确定,所以还需要考虑覆盖和其中一个数组没有遍历结束的情况;
不同解法:
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
// 利用的是Array里面的自带方法 - 方便熟悉
var merge = function(nums1, m, nums2, n) {
nums1.splice(m,n,...nums2); // 插入nums2
nums1.sort((a,b) => a-b); // 整体排序
};
// 使用三个指针进行排序,时间复杂度是O(n^2)
var merge = function(nums1, m, nums2, n){
if(nums2.length == 0){
return;
}
var k = 0, i = 0, j = 0; // k 表示插入的位置,i遍历nums1,j遍历nums2
var newNums1 = nums1.slice(0,m);
for(k ; k < m+n; k++){
// 如果 nums2 遍历结束,将 nums1 直接加入
if(j == n){
while(i < m){
nums1[n+i] = newNums1[i];
i++;
}
// console.log(nums1)
return;
}
// 如果 nums1 遍历结束,将 nums2 直接加入
if(i == m){
while(j < n){
nums1[m+j] = nums2[j];
j++;
}
// console.log(nums1)
return;
}
if(newNums1[i] <= nums2[j]){
nums1[k] = newNums1[i++];
}else{
nums1[k] = nums2[j++];
}
}
}
// 【继续改进】 -> 将nums1中需要排序的m个元素插入到尾部 -> 不用考虑如果nums2提前遍历完的情况
// 循环结束条件:nums2循环遍历完,不用考虑nums1遍历完
var merge = function(nums1, m, nums2, n){
//将nums1中需要排序的m个元素插入到尾部
//循环方向从后往前,如果m>n,就会有“重叠”,从前往后循环,就会造成覆盖,移动就会造成问题
for(var count = 1; count <= m ; count++){
nums1[m+n-count] = nums1[m-count];
}
//遍历 nums2
var i = n; // 用来遍历nums1
var j = 0; // 用来遍历nums2
var k = 0; // 代表插入的位置
while(j < n){
//如果遍历nums1结束,直接将nums2 加到最后 (这一块【可加可不加】,提交都能通过)
if(k == m+j){// 或条件设为 i == n+m
while(j < n){
nums1[k++] = nums2[j++];
}
return;
}
if(nums1[i] <= nums2[j]){
nums1[k] = nums1[i++];
}else{
nums1[k] = nums2[j++];
}
k++;
}
}
// 【继续改进】:从nums1的末尾开始,比较两个数组最大的值
// 循环方向从后向前,同样可以防止覆盖
var merge = function(nums1, m, nums2, n){
var 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--];
}
}
LeetCode系列之 (JavaScript) => 88. 合并两个有序数组的更多相关文章
- [LeetCode每日一题]88. 合并两个有序数组
[LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- 【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 知识点:数组:排序:双指针: 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 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合并两个有序数组-Java
1. 具体题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别 ...
- leetcode刷题-88.合并两个有序数组
题目 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- 【LeetCode】Merge Sorted Array(合并两个有序数组)
这道题是LeetCode里的第88道题. 题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nu ...
- LeetCode【88. 合并两个有序数组】
首先想到的方法就是,假设一个nums3数组,然后,比较nums1与nums2的数值大小,然后,放在nums3中,再将nums3转移到nums1中. 实现起来很麻烦,1.没有考虑到下标问题,结果就Arr ...
随机推荐
- 冒泡排序快速排序C语言
//冒泡排序 void BubbleSort(ElemType A[], int n) { int i, j, temp; int flag=1; for (i = 1; i <= n - 1& ...
- 网页识别语音插件annyang可以实现识别中文
<html> <script src="a.js"></script> <script> if (annyang) { var co ...
- 20203412马畅若 实验二《Python程序设计》实验报告
20203412马畅若 实验二<Python程序设计>实验报告 课程:<Python程序设计>班级: 2034姓名:马畅若学号:20203412实验教师:王志强实验日期: ...
- 推荐优秀国产蓝牙芯片-HS6621CxC系列
HS6621CxC是一个优化功耗真正芯片系统(SOC)解决方案,适用于蓝牙低功耗和私有的2.4GHz应用场景.它集成了一个高性能.小功率的射频收发器,具有蓝牙基带和丰富的外围IO扩展. HS6621C ...
- xorg 屏幕分辨率设置(x11分辨率设置/linux分辨率设置)
记录一下,用于linux虚拟机分辨率设置.https://blog.csdn.net/weixin_36084095/article/details/116839103(在谷歌搜索是简书的文章,在百度 ...
- CAD坐标显示不全怎么办?CAD坐标常见问题解答!
今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和小编一起来了解 ...
- pySpark RDD基本用法
pySpark RDD基本用法 RDD的全称是:Resilient Distributed Dataset (弹性分布式数据集),它有几个关键的特性: RDD是只读的,表示它的不可变性. 可以并行的操 ...
- SQLite检查表是否存在
通过检索SQLite的内置表sqlite_master,查询是否有需要检索的表信息,即可得出该表是否存在. SELECT * FROM sqlite_master WHERE type='table' ...
- 前后端分离--token过期策略方案1
https://blog.csdn.net/weixin_38827340/article/details/86287496?utm_medium=distribute.pc_aggpage_sear ...
- SAP管理员SAP*和DDIC被锁定后如何解锁或重置密码
SAP*初始化密码是06071992或passDDIC默认密码为19920706 环境信息:win server2003,SQL Server2008 R2 账号信息存在于数据库usr02表中,1.删 ...