《程序员面试金典(第6版)》面试题 10.01. 合并排序的数组

news2024/9/25 19:14:30

题目描述

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

  • 初始化 A 和 B 的元素数量分别为 m 和 n。

示例:

  • 输入:
    A = [1,2,3,0,0,0], m = 3
    B = [2,5,6], n = 3

  • 输出: [1,2,2,3,5,6]

说明:

  • A.length == n + m

解题思路与代码

这道题的难度是简单题。可以说没什么太多的可讲的。

方法一:使用sort函数

思路就是用b的元素将a中的0替换掉,然后sort(),重新排序一下就好,可以说是没有什么技术含量的啦。

具体代码如下:

class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        if(B.empty()) return;
        int point = 0;
        for(int i = 0; i < A.size(); ++i){
            if(A[i] == 0 && point < B.size()){
                A[i] = B[point];
                ++point;
            }
        }
        sort(A.begin(),A.end());
    }
};

复杂度分析

时间复杂度:

  • 首先,这个解决方案中的 for 循环遍历了 A 的所有元素。因为 A 的长度为 m+n,所以这个循环的时间复杂度是 O(m+n)。
    接下来,sort 函数对 A 进行排序。在 C++ 中,sort 函数的平均时间复杂度是 O(N*log(N)),这里 N 是需要排序的数组长度,也就是 A 的长度,即 m+n。因此,排序的时间复杂度是 O((m+n)*log(m+n))。
    因此,这个解决方案的总时间复杂度是 O((m+n) + (m+n)*log(m+n)),可以简化为 O((m+n)*log(m+n))。

空间复杂度:

  • 这个解决方案在原数组 A 上进行了操作,并没有使用额外的空间来存储合并后的结果。所以,空间复杂度为 O(1)。

小总结

这种做法其实没有完全用到题目给我们的一些条件。比如说,A 与 B 是两个有序数组。所以在性能上,是比较差的。

方法二:双指针(多指针)从后向前遍历

这里我其实用到了3个指针,但我感觉只要是超过了2个指针的题,大家都默认叫双指针,我觉得其实不是很准确,其实是三指针解决的这道题。我也不想标新立异,那就叫双指针的题好啦。

这道题主要的解题思路是这样的。我们将一个指针指向A数组的除0以外的最后一个元素,另一个指针指向B数组最后一个元素,最后一个指针指向A数组最后一个元素。使用while循环从后向前遍历。

具体实现,请看代码:

class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int pA = m - 1;
        int pB = n - 1;
        int pEnd = n + m - 1;
        while(pA >= 0 && pB >= 0){
            if(B[pB] > A[pA]){
                A[pEnd] = B[pB];
                --pB;
            }else{
                A[pEnd] = A[pA];
                --pA;
            }
            --pEnd;
        }
        while(pB >= 0){
            A[pEnd] = B[pB];
            --pB;
            --pEnd;
        }
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • 因为我们的两次的while循环加起来,一共遍历的元素个数为M+N,所以这道题的时间复杂度为O(M+N)

空间复杂度:

  • 由于我们没有使用任何的辅助数组,所以这道题的空间复杂度为O(1)

总结

这道题我感觉考验你的其实就是一个关于指针的使用能力,没别的了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单六步,帮助HR高效管理零工

AIHR发布的《2023人力资源趋势》中提到&#xff0c;过去HR往往只关注全职员工&#xff0c;忽略了其他劳动力生态系统成员&#xff0c;比如零工、外包员工和临时工等&#xff0c;而如今这些劳动力生态系统的成员在公司的服务交付中发挥着越来越重要的作用。△ 传统劳动力生态系统…

Java入坑之集合、流与序列化

一、集合 1.1集合定义 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多元素组合成一个单一单元的容器对象。集合&#xff0c;可用于存储/检索/操作/传输/聚合数据集合框架&#xff1a; 表示和操作集合的体系&#xff0c;包括接口、实现类&#xff0c;集合框架的…

【Nav2】Ubuntu18+ROS2 Eloquent跑通Navigation2仿真示例

【背景】 打算通过Navigation2来了解ROS2的核心两大件——LifeCircle和BehaviorTree&#xff0c;结果根据官网的教程一顿鼓捣&#xff0c;这个Turtlbot3的仿真就是跑不起来&#xff0c;这怎么能忍&#xff1f;虽然在Ubuntu20上使用Foxy版本可以非常容易就跑通demo&#xff0c;…

3年外包终上岸,我只能说:但凡有点机会,千万别去外包...

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司的软件测试岗&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&am…

behaviac —— Win10下Vs2017编译“腾讯行为树“源码

简介 - 腾讯行为树 behaviac是游戏AI的开发框架组件,也是游戏原型的快速设计工具。支持全平台,适用于客户端和服务器,助力游戏快速迭代开发 。编辑器可以运行在PC上,操作方便直观可靠,支持实时和离线调试;编辑器可以导出xml,bson等多种格式,更可以导出C++、C#源码,提供…

免费1年服务器,部署个ChatGPT专属网页版

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 白皮袄个免费1年服务器&#xff0c;部署个ChatGPT专属网页版&#xff01; api.openai.com port 443: Connection timed out 你是…

Spring Security --- 基于内存模型创建用户角色

授权实现方式 基于内存模型实现授权基于默认数据库模型实现授权基于自定义数据库模型实现授权 基于内存模型创建用户角色 在Spring Security4.x版本中&#xff0c;登陆的用户有一个默认的ROLE_USER角色但是在Spring Security5.x版本中&#xff0c;把这个默认的角色给去掉了需要…

推荐一个3D建模工具集

3D建模工具集, 收录一下几个工具集&#xff1a;数字孪生编辑器 基于WebGL技术&#xff0c;依托丰富的模型资产库&#xff0c;通过拖拽式的操作&#xff0c;方便用户高效便捷的搭建三维数字孪生场景&#xff0c;配合twin服务平台&#xff0c;实现孪生设备姿态控制的虚实…

2023年第十四届蓝桥杯 C++ B组参赛经历和总结

2023年第十四届蓝桥杯 C B组参赛经历和总结 目录2023年第十四届蓝桥杯 C B组参赛经历和总结前言走上算法之路备考备战之路蓝桥杯比赛过程感受总结值不值得打备赛建议前言 写这篇博客的缘故&#xff0c;因为看到好几篇记录自己蓝桥杯经历的博客&#xff0c;于是乎我也想写一篇&…

【论文精读】Arxiv 2023 - Segment Anything

【论文精读】Arxiv 2023 - 分割一切 【论文原文】&#xff1a;Segment Anything 【作者信息】&#xff1a;Kirillov, Alexander and Mintun, Eric and Ravi, Nikhila and Mao, Hanzi and Rolland, Chloe and Gustafson, Laura and Xiao, Tete and Whitehead, Spencer and Ber…

如何设计帮助中心才能真正地帮助客户解决问题?

对于当今如此智能的时代&#xff0c;大多数人都习惯性地自己解决问题&#xff0c;所以在浏览某个网站或是使用某个产品遇到问题时&#xff0c;第一反应不再是找客服&#xff0c;而是到帮助中心去寻找解决问题的办法&#xff0c;因此&#xff0c;帮助中心变得越来越重要了。 那…

c# wpf log 调试 输出窗口

需求 刚好需要新手入门开发一个WPF界面&#xff0c;所以需要一些日志输出 其实我们只是简单的入门调试&#xff0c;只需要很简单的输出 真不需要log4net, expression等等比较长期地&#xff0c;跨度比较大的日志系统 而且这些日志系统接入也比较麻烦 有没办法做一个简单的…

多线程的使用与解释

多线程 文章目录多线程什么是多线程线程特点线程的使用线程的创建线程ID获得线程终止线程等待进程分离什么是多线程 是资源调用的最小单位。一个进程内部的控制序列。线程是调度的基本单位。 线程有共享进程的数据&#xff0c;也有自己 的一部分数据 线程特点 1&#xff0c…

电脑回收站删除的文件还能找回吗 电脑回收站删除的文件怎么恢复

电脑回收站是保护电脑文件和数据的重要屏障&#xff0c;被删除的文件数据在这里会被保存很久&#xff0c;直到被用户永久删除。为了保证电脑系统的流畅运行&#xff0c;我们会对电脑回收站进行清理。在一系列的操作过后&#xff0c;我们可能会发现自己误删了重要文件。那么电脑…

Leetcode135. 分发糖果

Every day a leetcode 题目来源&#xff1a;135. 分发糖果 解法1&#xff1a;贪心 首先把所有孩子的糖果数初始化为1。 从左往右遍历一遍&#xff0c;如果右边孩子的评分比左边的高&#xff0c;则右边孩子的糖果数更新为左边孩子的糖果数加1。 再从右往左遍历一遍&#xf…

匈牙利算法学习记录

匈牙利算法主要用来解决两个问题&#xff1a;求二分图的最大匹配数和最小点覆盖数。 匈牙利算法事实上有两个算法&#xff0c;分别解决指派问题和二分图最大匹配求解问题&#xff0c;此处算法指求解指派问题的匈牙利算法。 处理流程 方法一 具体如何实现呢&#xff1f; 代码…

【数据结构】- 初识数据结构之时间复杂度(上)

文章目录前言一、什么是数据结构二、什么是算法三、算法效率3.1如何衡量一个算法的好坏3.2算法复杂度四、时间复杂度4.1时间复杂度的概念4.2大O的渐进表示法4.3常见时间复杂度计算举例总结前言 努力不是为了和别人一较高下 而是为了让生活多一种可能 别让世俗淹没生活的浪漫和…

MySQL:基本常识介绍、操作数据库、操作数据库中的表、操作表中的数据(增删改查)、MySQL 函数

文章目录Day 02&#xff1a;一、常见的 SQL 语句二、基本常识1. 数据库的列类型2. 数据库的字段属性三、操作数据库1. 操作数据库2. 操作数据库中的表&#xff08;1&#xff09;创建表&#xff1a;CREAT&#xff08;2&#xff09;修改表&#xff1a;ALTER&#xff08;3&#xf…

肖 sir_就业课__014python讲解

python讲解 一、python梳理 1、python 数据类型有哪些&#xff1f; 字符、列表、元组、字典、集合 2、列表、元组、字典、集合的区别&#xff1f; 3、python中函数&#xff1f; &#xff08;1&#xff09;自定义函数 def 函数名&#xff08;&#xff09; &#xff08;2&#…

聊聊架构方案选择

大家好&#xff0c;我是易安&#xff01; 在完成备选方案设计后&#xff0c;如何挑选最终的方案是一个很大的挑战&#xff0c;因为每个备选方案都是可行的。但是&#xff0c;没有哪个备选方案是完美的&#xff0c;因为每个方案都存在一些缺点或风险。此外&#xff0c;评价备选方…