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

简介

题目链接:https://leetcode.cn/problems/merge-sorted-array/description/

解决方式:数组 + 双指针

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐查看灵茶山艾府大佬所作题解。

双指针

解题思路:双指针。不过与以往不同的是,此处双指针是倒序遍历数组。因为根据题目可知,数组是非严格递增的,最后一个元素是该数组最大的元素。我们从后往前遍历,可以很好的利用到 nums1 数组后面空出来的空间,而且移动元素都是有效操作。如果我们从前往后遍历,会出现每次都需要移动后面元素的情况,很多无效的移动操作,不如从后往前遍历高效。

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // p1 指向 nums1 最后有效元素,p2 指向 nums2 最后元素,p 指向 nums1 最后元素
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;
        // 一直迭代,直到 nums2 中的所有元素合并到 nums1
        while(p2 >= 0){
            // 如果 p1 元素大于 p2,则 p1 元素移到 nums1 数组的最后,反之亦然
            if(p1 >= 0 && nums1[p1] > nums2[p2]){
                // 有可能出现 p1 的元素都比 p2 小,所以需要判断 p1 >= 0
                nums1[p--] = nums1[p1--];
            }else{
                nums1[p--] = nums2[p2--];
            }
        }
    }
}
相关推荐
汀、人工智能12 小时前
[特殊字符] 第21课:最长有效括号
数据结构·算法·数据库架构·图论·bfs·最长有效括号
Boop_wu13 小时前
[Java 算法] 字符串
linux·运维·服务器·数据结构·算法·leetcode
故事和你9113 小时前
洛谷-算法1-2-排序2
开发语言·数据结构·c++·算法·动态规划·图论
Fcy64813 小时前
算法基础详解(三)前缀和与差分算法
算法·前缀和·差分
kvo7f2JTy14 小时前
基于机器学习算法的web入侵检测系统设计与实现
前端·算法·机器学习
List<String> error_P14 小时前
蓝桥杯最后几天冲刺:暴力大法(一)
算法·职场和发展·蓝桥杯
迈巴赫车主15 小时前
蓝桥杯3500阶乘求和java
java·开发语言·数据结构·职场和发展·蓝桥杯
流云鹤15 小时前
Codeforces Round 1090 (Div. 4)
c++·算法
wljy115 小时前
第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯·stl
清空mega16 小时前
C++中关于数学的一些语法回忆(2)
开发语言·c++·算法