图解一道今日头条面试算法题

Python-Numpy学习之【ndim、shape、dtype函数的区别】 刚开始学习numpy,对ndim、shape还有dtype这几个函数的含义有些混淆,所以简单记录下。 ndim函数:返回一个数字,确定数组的维度 备注:个人小技巧(不知道准不准),从列表转数组时,确定数组的维度的话可以看一开始中括号的个数,几个中括号就是几维。 shape函数:返回一个元组,确定各个维度的元素个数 对于arr11:它是一个一维数组,返回的(4,)代表一维里面有四个元素 对于arr22:它是一个二维数组,返回的(2,3)中 2 代表的是行(row),代表一维里面有2个元素,3代表的是列(c 阅读详情

前几天听同事分享了一道今日头条的算法面试题,感觉非常有趣,今天也分享给大家,题目是这样的:

给定一个有序数组,数组中有正数、负数或者0,对数组中所有的数求平方后问有多少个不同的值。

比如对于数组[-1,0,1,1,1,1],对数组求平方后为[1,0,1,1,1,1],那么最终的结果是2,因为最后只有0和1两个不同的数;

对于数组[-1,0,1,2,3],对数组求平方后为[1,0,1,4,9],那么最终的结果是4,因为最后数组中为0,1,4,9这四个不同的数;

同事提到只有时间复杂度为O(n),空间复杂度为O(1)的算法才能通过面试,在听到这个题目后首先想的就是如果在面试中自己遇到这个题目该如何解决?

我是如何思考的

如果在面试中遇到这个题目我会先给出一个最简单的解法,也就是直接对数组中的每一个数字求平方,然后放到map中,最后求一下map的大小就可以了,整个过程如图所示:

实际上这种解法有个问题,那就是对数字求平方和容易导致溢出,而实际上我们根本就无需求平方,实际上只需要求出绝对值就可以了,只要两个数字的绝对值相等,那么这两个数字的平方也一定相等。因此我们只需要将上图中的第一步由求平方改为求绝对值就可以了。

这个算法相对简单,也很容易想到,实际复杂度为O(n)满足要求,但是由于我们使用了map,因此空间复杂度为O(n),不能满足面试要求的O(1),那么该如何改进呢?

在往下看之前你要首先自己想一想该如何改进。

优化算法:利用数组有序

不要忘了题目给定的是一个有序数组,上图中的算法没有利用到这一性质。

我的想法是这样的,给定一个有序数组,如果这个数组中没有负数,那么这个题目是极其简单的,因为在一个有序数组中相同的数组一定是相邻的。

比如对于数组[0,1,1,1,1],其中四个1是相邻的,我们只需要在遍历数组的时候不计入重复的数字就可以了。

但是现在问题的关键在于数组中还有负数,对于负数该如何处理呢?很简单,我们只需要将负数部分转为正数就可以了,这样我们就得到了两个子数组,这两个子数组都是有序的,然后将这两个有序子数组原地合并,这样就得到了一个不包含负数的有序数组,问题圆满解决,如图所示:

问题

看上去看正确有没有,没有额外使用空间,而且时间复杂度是O(n),但是,这里有一个问题,这个问题出在了上图中的第4步,也就是原地合并数组中的两个部分,当时思考的时候没有意识到,那就是没有办法在不借助额外内存空间的情况下合并两个有序子数组,至少我没有想到这样的方法,如果你想到了请务必在公众

图解一道今日头条算法面试题 文章目录我是如何思考的优化算法:利用数组有序问题再次思考进一步优化代码实现总结 前几天听同事分享了一道今日头条的算法面试题,感觉非常有趣,今天也分享给大家,题目是这样的: 给定一个有序数组,数组中有正数、负数或者0,对数组中所有的数求平方后问有多少个不同的值。 比如对于数组[-1,0,1,1,1,1],对数组求平方后为[1,0,1,1,1,1],那么最终的结果是2,因为最后只有0和1两个不同的数;... 阅读详情

相关推荐

Java工程师修炼之路—从Java小白到收获BAT等offer

在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易,华为等。一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且,我对校园招聘也做了一些研究和相应的准备。在今年的秋季招聘结束以后,我也决定把这些东西全部都写成文字,做成专题,以便分享给更多未来将要参加校招的同学。希望大家能从文章中得到帮助获得收获,也可以评论出你想看哪方面的技术。

m0_73849256的博客 426

C#中数组初始化的几种方式

我们可以使用直接初始化、使用new关键字初始化以及动态初始化来创建并初始化数组。在这个例子中,我们首先声明了一个变量size,表示数组的大小。本文将介绍C#中数组初始化的几种常用方式,并附上相应的源代码和描述。在这个例子中,我们指定了数组的大小为5,并在大括号内提供了初始值。我们可以在声明数组变量的同时,使用大括号{}来初始化数组元素。动态初始化数组是在声明数组变量后,根据需求分配内存空间和初始值的一种方式。以上就是关于C#数组初始化的几种方式的相关内容,希望对你有所帮助。C#中数组初始化的几种方式。

code_welike的博客 2089

c语言cJson数组生成与解析

1.生成 json char* CreatJsCustNo( BT_BNF_CUST *p, char *strPaperNO) { cJSON *pJsonArry,*pJsonsub; pJsonArry=cJSON_CreateArray(); /*创建数组*/ cJSON_AddItemToArray(pJsonArry,pJsonsub=cJSON_CreateObject()); /* 给创建的数组增加对对象*/ cJSON_AddStringTo

我不是码农的博客~~~ 1997

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 415

从原理到实践:手把手教你如何校准和使用六维力传感器(附常见问题排查)

本文详细解析六维力传感器的工作原理与校准方法,提供从选型到故障排查的完整指南。重点介绍电阻式与电容式技术对比、六步校准法实战以及温度补偿技巧,帮助工程师精准测量空间力场。适用于机器人触觉反馈、航空航天测试等高精度场景。

weixin_29309475的博客 386

如何查看在电脑里登陆过的微信帐号的聊天记录

打开微信电脑版,点击左下角 "≡" 菜单 → 选择 "设置"进入 "账号与存储"(旧版为" 文件管理 ")选项卡在 "存储位置"一栏查看当前实际保存路径,可点击" 打开文件夹 " 直接访问查看电脑里登录过的微信账号聊天记录,首选官方客户端直接登录查看,操作简单且安全;若账号已退出,可通过备份恢复功能处理;仅需查看媒体文件时,可定位到FileStorage 文件夹直接访问。无论哪种方式,都需遵守隐私保护原则,并注意聊天记录的加密特性限制。

捷利迅分享的博客 4519

开关电源EMC整改实录:用WSX系列共模电感搞定30MHz辐射超标

本文详细介绍了开关电源EMC整改实战,通过WSX系列共模电感成功解决30MHz频段辐射超标问题。文章分析了共模干扰的产生机制,对比了不同磁芯材料的性能差异,并提供了电路布局优化与安装技巧,最终通过实测数据验证了整改方案的有效性。

weixin_29305313的博客 414

基于STM32设计的指针式电子钟与万年历(升级版)

这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。

1万+

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

使用OpenGL加载和显示DXF格式的3D模型文件编程

这样,我们就完成了使用OpenGL加载和显示DXF格式的3D模型文件的编程。通过实现加载函数和绘制回调函数,我们能够读取DXF文件的数据并使用OpenGL绘制出来。请注意,这只是一个简单的例子,仅涵盖了基本的加载和显示功能。在本文中,我们将探讨如何使用OpenGL编程加载和显示DXF(Drawing Exchange Format)格式的3D模型文件。DXF是一种通用的CAD(计算机辅助设计)文件格式,常用于存储和交换2D和3D图形数据。使用OpenGL加载和显示DXF格式的3D模型文件编程。

2301_79331421的博客 411

YOLO26 改进 | (教师:YOLOv8L,学生:YOLO26) | 知识蒸馏 (Knowledge Distillation)

本文介绍了基于YOLO26框架的知识蒸馏实战方法,通过教师模型指导学生模型训练,在不增加推理成本的情况下提升模型精度。文章详细阐述了基于响应的知识蒸馏实现方案,通过最小化教师与学生模型预测Logits间的KL散度实现知识迁移。核心实现包括:1) 创建DistillationModel包装器类,同时运行师生模型;2) 自定义DistillationLoss,在原检测损失基础上增加KL散度损失。该方法适用于希望保持YOLO26轻量级特性同时获得接近大模型精度的场景,文中提供了完整的代码实现方案。

weixin_51988935的博客 510

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: LeetCode:二叉树最低公共祖先
下一篇: 图解LeetCode97:Interleaving String
码农的荒岛求生
博客等级 码龄10年 969粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值