《程序员面试金典(第6版)》面试题 16.06. 最小差(双指针,pair数据结构)

news2024/11/10 12:58:07

题目描述

给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

示例:

  • 输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}
  • 输出:3,即数值对(11, 8)

提示:

  • 1 <= a.length, b.length <= 100000
  • -2147483648 <= a[i], b[i] <= 2147483647
  • 正确结果在区间 [0, 2147483647] 内

解题思路与代码

这道题呢,首先从正常的思路想嘛,看看能不能暴力破解。也就是两层for循环解决问题。我试了,发现不行。好的那我们就另找方法。

根据这道题的题意。我总结出来两种做题的方法,一种是合并两个数组,然后统一排序,之后遍历整个数组就好了。另一种是给两个数组分别排序,用双指针去遍历数组解决这道问题。

方法一:合并 + 排序

  • 我们这里用到了vector<pair<int,char>>这样的数据结构来解决这个问题。如果说,小伙伴们对pair这种数据结构了解了话,一看到这个,可能就脑子里直接就有答案了。

  • 我们分别把a,b两个数组遍历进合并数组vec中,用sort给它进行排个序。之后挨个元素进行比较就行了。

具体实现请看代码:

class Solution {
public:
    int smallestDifference(vector<int>& a, vector<int>& b) {
        vector<pair<int,char>> vec;
        for(int i = 0; i < a.size(); ++i)
            vec.push_back({a[i],'a'});
        for(int i = 0; i < b.size(); ++i)
            vec.push_back({b[i],'b'});

        sort(vec.begin(),vec.end(),[](const pair<int,char>& l, const pair<int,char>& r) -> bool{ return l.first < r.first;});
        
        int minAbs = INT_MAX;
        for(int i = 1; i < vec.size(); ++i){
            long long vec1 = vec[i-1].first;
            long long vec2 = vec[i].first;
            if(vec[i-1].second != vec[i].second){
                if( vec2 - vec1 > 2147483648) continue;
                else if(vec2 - vec1 < minAbs) minAbs = vec2 - vec1;
            }
        }
        return minAbs;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • 我们将数组a的元素个数记作n,数组b的元素记作m
  • 第一个for循环,将数组a中的元素放入vec中,需要O(n)的时间。
  • 第二个for循环,将数组b中的元素放入vec中,需要O(m)的时间。
  • 对vec进行排序,时间复杂度为O((n + m) * log(n + m))。
  • 最后一个for循环,遍历整个vec,时间复杂度为O(n + m)。

总的时间复杂度为O((n + m) * log(n + m))。

空间复杂度:

  • vec数组的长度为n + m,空间复杂度为O(n + m)。除了vec数组,其他变量所占用的空间可以忽略不计。所以总的空间复杂度为O(n + m)。

方法二:排序 + 双指针

  • 在这种方法里,我们先分别将数组a,b中的元素进行排序,之后设置两个指针,分别指向两个数组的首元素。

  • 我们使用一个while循环去遍历两个指针,当两个指针中的任意一个走到头时,就结束此次遍历。

  • 我们每次遍历,都拿a中的元素去减b中的元素,如果是负数,a向前走一步,反之,b向前走一步。每走一步,都计算一次差值,并每次都去与之前的差值进行比较,找出最小的那一个。

  • 遍历完成后返回

具体的代码如下:

class Solution {
public:
    int smallestDifference(vector<int>& a, vector<int>& b) {
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        long long minSub = INT_MAX;
        int p1 = 0;
        int p2 = 0;
        while(p1 < a.size() && p2 < b.size()){
            long long sub = a[p1] - b[p2];
            if(sub < 0) ++p1;
            else if(sub > 0) ++p2;
            else return 0;
            minSub = min(minSub,abs(sub));
        }
        return minSub;
    }
};

在这里插入图片描述

复杂度分析

这段代码实现了一个名为smallestDifference的函数,用于求两个整数数组a和b中分别取一个数,使得它们之间的差的绝对值最小。我们将使用n和m分别代表数组a和数组b的元素个数,分析这段代码的最简时间复杂度和空间复杂度。

时间复杂度:

  • 对数组a进行排序,时间复杂度为O(n * log(n))。
  • 对数组b进行排序,时间复杂度为O(m * log(m))。
  • while循环,在最坏情况下(即数组a和数组b中的元素没有相等的数),需要遍历整个数组a和数组b,时间复杂度为O(n + m)。
  • 合并后的总时间复杂度为:O(n * log(n) + m * log(m) + n + m)。在表示最简时间复杂度时,我们可以忽略线性项n和m,因为它们相对于n * log(n)和m * log(m)的影响较小。因此,最简时间复杂度为O(n * log(n) + m * log(m))。

空间复杂度:

  • 由于这段代码没有使用额外的数据结构来存储数据,我们只需要考虑变量占用的空间。在这个例子中,变量所占用的空间可以忽略不计。因此,空间复杂度为O(1)。

总结

这道题考察了对元素的排序与查找。我们使用到了双指针这种算法思想,和使用到了vector去嵌套pair这种数据结构,也算是这道题的一个考点吧。

总之,这道题是一道关于双指针的一道不错的练手题。值得一做。

  • 最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

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

相关文章

Power BI动态日期轴方法总结

趋势&#xff0c;应该是我们做可视化时最熟悉的一个词了&#xff0c;看趋势自然离不开日期&#xff0c;年度趋势&#xff0c;月趋势&#xff0c;周趋势等等。Power BI中我们可以借助于计算表&#xff0c;计算组&#xff0c;字段参数来实现动态实时轴的效果。 计算表实现动态日…

Node.js--基础

一、Node.js是什么 Node.js is a JavaScript runtime built on Chrome’s V8 JavaScript engine. 1、特性 Node.js 可以解析JS代码&#xff08;没有浏览器安全级别的限制&#xff09;提供很多系统级别的API&#xff0c;如&#xff1a; 文件的读写 (File System)进程的管理 …

每日一个小技巧:1分钟告诉你文字转图片的方法有哪些

在数字时代&#xff0c;信息传递快速便捷&#xff0c;但文字在传递中却显得单调乏味&#xff0c;难以吸引人们的眼球。为了解决这个问题&#xff0c;越来越多的人开始寻找方法将文字转化为图片。文字转图片不仅能够让文字更具视觉冲击力&#xff0c;还能够在社交媒体、广告宣传…

Nginx常见应用场景

文章目录 场景一&#xff1a;代理静态文件场景二&#xff1a;代理服务器 本教程讲述 Nginx 的常见应用场景。内容接上文&#xff1a;Nginx基本配置。 前提&#xff1a;假设我们已经安装好了 Nginx&#xff0c;并启动成功。 场景一&#xff1a;代理静态文件 Nginx 一个常用的功…

Hilt 和协程助力启动框架搭建:解决代码混乱和初始化策略问题

关于Hilt的使用&#xff0c;目前已经比较普及了&#xff0c;想必大家已经知道。今天说的是一个如何利用Hilt来做一个启动框架的故事。 是否经历过大型项目的启动优化&#xff0c;一遍过去无任何效果&#xff0c;第二遍过去好几处报错&#xff0c;第三遍过去启动不了&#xff0…

开放耳机有什么优缺点,列举出几款口碑不错的开放式耳机

开放式耳机是通过骨头振动传递声音&#xff0c;而不是通过耳道或鼓膜&#xff0c;因此它具有许多优势&#xff0c;比如可以在运动过程中保持对环境的感知&#xff0c;并避免对听力造成伤害。随着科技的进步和用户需求的增加&#xff0c;开放式耳机也在不断更新。目前市面上的开…

springboot+nodejs+vue众筹项目管理系统平台系统

筹资人&#xff08;企业&#xff09;&#xff1a; 1&#xff0c;可以后台注册并登录&#xff0c;发布项目情况&#xff0c;众筹项目需要管理员审核通过后才能展现在前台&#xff0c;没有审核或者审核不通过不会在前台展示&#xff1b; 众筹项目包括项目名称&#xff0c;项目分类…

盲目自学网络安全只会成为脚本小子?

前言&#xff1a;我们来看看怎么学才不会成为脚本小子 一&#xff0c;怎么入门&#xff1f; 1、Web 安全相关概念&#xff08;2 周&#xff09; 了解网络安全相关法律法规 熟悉基本概念&#xff08;SQL 注入、上传、XSS、CSRF、一句话木马等&#xff09;。 通过关键字&…

springboot整合flowable的简单使用

内容来自网络整理&#xff0c;文章最下有引用地址&#xff0c;可跳转至相关资源页面。若有侵权请联系删除 环境&#xff1a; mysql5.7.2 springboot 2.3.9.RELEASE flowable 6.7.2 采坑&#xff1a; 1.当前flowable sql需要与引用的pom依赖一致&#xff0c;否则会报library…

管理后台项目-07-菜单管理和动态展示菜单和按钮

目录 1-菜单管理 1.1-菜单管理列表 1.2-添加|修改功能 1.3-删除菜单 2-动态菜单按钮展示 2.1-路由文件的整理 2.2-动态展示不同的路由 1-菜单管理 当用户点击菜单管理的时候&#xff0c;会展示当前所有菜单&#xff0c;树型结构展示...并且可以对菜单进行新增编辑删除操…

倾斜摄影超大场景的三维模型在网络发布应用遇到常见的问题浅析

倾斜摄影超大场景的三维模型在网络发布应用遇到常见的问题浅析 倾斜摄影超大场景的三维模型在网络发布应用时&#xff0c;常见的问题包括&#xff1a; 1、加载速度慢。由于数据量巨大&#xff0c;网络发布时需要将数据文件分割成多个小文件进行加载&#xff0c;这可能会导致页…

Sonatype Nexus兼容apk格式仓库

Sonatype Nexus兼容apk格式仓库 sonatype/nexus3 当前最新版本&#xff1a;sonatype/nexus3:3.52.0 查看nexus支持的仓库格式 创建一个nexus 容器&#xff1a; docker run -d -p 8081:8081 --name nexus sonatype/nexus3:3.52.0查看启动日志&#xff1a; docker logs nexu…

HTML5画布(图像)

案例1&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title><script>window.onloadfunction(){var cdocument.getElementById("myCanvas");var cxt c.getConte…

Vue3 手把手按需引入 Echarts

背景&#xff1a;新项目采用 Vue3 作为前端项目框架&#xff0c;避免不了要使用 echarts&#xff0c;但是在使用的时候&#xff0c;出现了与 Vue2 使用不一样的地方&#xff0c;所以特别记下来&#xff0c;希望给到有需要的同学一些帮助。 下载Echarts依赖 # 自己使用的yarn y…

《Odoo开发者模式必知必会》—— 缘起

Odoo作为业界优秀的开源商务软件&#xff0c;在全球范围内拥有广泛的使用者。在领英国际&#xff0c;可以搜索到全球很多国家都有大量odoo人才需求的招聘信息。在国内&#xff0c;虽然已经有为数不少的企业&#xff0c;他们或者已经使用odoo&#xff0c;或者正在了解odoo&#…

支付宝异步通知说明

如何设置异步通知地址 不同接口接收异步通知设置方式不同&#xff0c;可查看 哪些接口支持触发异步。 设置 notify_url 接收异步 对于支付产生的交易&#xff0c;支付宝会根据原始支付 API 中传入的异步通知地址 notify_url&#xff0c;通过 POST 请求的形式将支付结果作为参…

从零开始学习CTF的完整指南

前言 想要学习CTF却不知从何开始&#xff1f;本文提供了一份完整的指南&#xff0c;从Linux系统基础、网络协议基础、二进制分析、Web安全、杂项题型以及算法与密码学等方面&#xff0c;为零基础小白提供了学习路线和知识点概述。 网络安全 网络安全是 CTF 的基础&#xff0…

还不知道怎么 Mock ,用这 6款工具

以下是几个常用的国外可以mock测试的工具&#xff0c;供参考&#xff1a; MockServer: MockServer 是一个开源的 API mock 测试工具&#xff0c;提供了强大的模拟服务器和 mock 服务功能。MockServer 支持多种语言和格式&#xff0c;包括 Java、.NET、REST、SOAP 等。 WireMoc…

优思学院|做质量管理有七大工具,都是什么?

质量管理七大工具&#xff08;Seven Basic Quality Tools&#xff09;是由日本质量大师石川馨于20世纪50年代首次提出&#xff0c;这些工具被广泛应用于制造业和服务业的质量管理实践中&#xff0c;优思学院认为这七个工具除了是质量人常用的工具之外&#xff0c;也可作为学习六…

OpenGL光照:光照基础

引言 现实世界的光照是极其复杂的&#xff0c;而且会受到诸多因素的影响&#xff0c;这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的光照仅仅使用了简化的模型并基于对现实的估计来进行模拟&#xff0c;这样处理起来会更容易一些&#xff0c;而且看起来也差不多一样。…