题目描述:

【Leetcode 题目链接】:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)

解题思路分析:

  1. 在nums1中找到nums2 插入的位置,然后在整体排序;
  2. 或采用合并排序的方式,逐个位置判断需要插入的元素(还要考虑循环方向,比如下面的第三种解法);
  3. 由于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. 合并两个有序数组的更多相关文章

  1. [LeetCode每日一题]88. 合并两个有序数组

    [LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...

  2. Java实现 LeetCode 88 合并两个有序数组

    88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...

  3. 【LeetCode】88. 合并两个有序数组

    88. 合并两个有序数组 知识点:数组:排序:双指针: 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 ...

  4. Leetcode 88 合并两个有序数组 Python

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

  5. LeetCode 88. 合并两个有序数组

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

  6. LeetCode 88. 合并两个有序数组(Merge Sorted Array)

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

  7. leetcode.双指针.88合并两个有序数组-Java

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

  8. leetcode刷题-88.合并两个有序数组

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

  9. 【LeetCode】Merge Sorted Array(合并两个有序数组)

    这道题是LeetCode里的第88道题. 题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nu ...

  10. LeetCode【88. 合并两个有序数组】

    首先想到的方法就是,假设一个nums3数组,然后,比较nums1与nums2的数值大小,然后,放在nums3中,再将nums3转移到nums1中. 实现起来很麻烦,1.没有考虑到下标问题,结果就Arr ...

随机推荐

  1. vue用echarts不显示

    在html页面中套vue的情况来使用echarts,或者单独vue使用echarts,出现页面不渲染图表,代码渲染有的情况,加个this.$nextTick(()=>{})让他主动渲染一下就可以 ...

  2. 创建一个httpserver、httpclient

    最近因为要和java进行通信.约定好使用http协议进行消息传递.在网上找了很久server编写发现有个博主写的很详细,因此把东西记录下来以便下次使用.这是原博主网址:https://blog.csd ...

  3. 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用

    机密 GKE 节点可用于计算优化的 C2D 虚拟机. 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件.在某些情况下,使用容器和 Kub ...

  4. parted创建硬盘分区并创建LVM

    基本分区创建分区只有那么大,无法调整大小,写入数据占满时便无法继续,而LVM特点就是可随意扩张大小,避免磁盘占满导致数据丢失. 查看磁盘lsblk 对磁盘进行分区  [root@localhost ~ ...

  5. linux环境通过nginx转发allure报告

    前言:   自动化测试生成的allure报告一般通过jenkins生成,生成后通过jenkins的view账号进行查看,但这样就必须登录jenkins才能看到,如何不通过登录jenkins从而看到al ...

  6. C++快速求解最大公因数 | gcd库函数

    1.介绍 gcd全称 :greatest common divisor 使用 __gcd( int x1, int x2 ) 函数可以高效.迅速得到x1, x2两个数的最大公因数.省去手写底层代码,专 ...

  7. joda实现时间工具类

    1.获取当前时间 (底层代码一致) val time1 = new DateTime() val time2 = DateTime.now() //底层调用的就是new DateTime() 2.格式 ...

  8. NTP Mode 6 检测漏洞【原理扫描】

    系统: AIX7 cd /etc cp ntp.conf ntp.conf.bak vi net.conf ## 在最后加上一行 restrict default notrust nomodify n ...

  9. centons7.2 双网口聚合功能配置和验证

    1.启动网络管理器运行systemctl restart NetworkManager2.创建主备绑定连接 nmcli connection add con-name bond0 type bond ...

  10. JavaScript常用的8个数组去重实战源码

      JavaScript常用的8个数组去重实战源码 在我们学习和使用JavaScript的中,会经常使用到数组的去重,接下来的内容,来给大家分享一下,我们在开发过程中,常用到的数组去重方法,这些方法都 ...