【LeetCode】剑指 Offer <二刷>(1)

目录

前言:

题目:剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


前言:

刚学 golang 半个多月,看了一堆的文档啊,框架啊,许许多多的东西,学到了很多,但是代码没有怎么上手写,所以我就决定用 golang 二刷剑指 Offer,增强我 golang 的代码能力。

题目:剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode)

题目的接口:

func findRepeatNumber(nums []int) int {}

解题思路:

这道题目一上来我就能想到两个比较常见的解法,首先是暴力解法,就是从第一元素开始遍历,直到遍历到另一个一样的元素就停下,这种解法是 O(N^2),复杂度非常的差,就不考虑了;

第二种方法是用哈希表,把数据依次放进哈希表中,等再次遇到同样的元素就找到了,这个的复杂度是 O(N),但是这种方法会有额外的空间开销,我就直接实现一下:

func findRepeatNumber(nums []int) int {hash := make([]int, len(nums))for _, n := range nums {if hash[n] == 1 {return n} else {hash[n] = 1}}return -1
}

虽然是二刷剑指 Offer,但是我还是忘了最优解,看了眼别的大佬的解答,第三种方式是基于题目要求的解法,题目限定了数组中的值是 0  ~ n - 1,具体思路就是:遍历数组,将数组的值作为索引,把该索引位置的值改成负数,如果我们遍历到负数,就先获取他变负数前的值,在根据这个值作为索引,如果索引位置是负数,证明这个值重复出现。

如果看一遍看不懂没关系,对着代码画个图模拟一下就很清晰了,以题目的示例为例:

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

遍历数组,第一个值是 2,他的索引位置是 1 >= 0,我们通过先取相反数再减一的方式将索引 2 位置的值变成负数,执行完数组的第一个值后:[ 2, 3, -2, 0, 2, 5, 3 ]

第二个值是 3,他的索引位置是 0 >= 0,同样的做法:[ 2, 3, -2, -1, 2, 5, 3 ]

第三个值是 1,他的索引位置是 3 >= 0,同样的做法:[ 2, -4, -2, -1, 2, 5, 3 ]

第四个值是 0,他的索引位置是 2 >= 0,同样的做法:[ -3, -4, -2, -1, 2, 5, 3 ]

第五个值是 2,他的索引位置是 -2 < 0,是负数,我们就得出值了。

这里补充一点,如果我们取到的值就是负数该怎么办?加一再取相反数就能获得他原本的索引值

代码:

func findRepeatNumber(nums []int) int {for _, n := range nums {if n < 0 { // 获取原本的索引值n = -(n + 1)}if nums[n] < 0 { // 如果是负数证明找到了return n} else { // 将该位置设置成负数nums[n] = -nums[n] - 1}}return -1
}

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库的基本概念

数据库 数据库由表集合组成&#xff0c;它是以一定的组织方式存储的相互有关的数据集合。 表&#xff1a;记录&#xff1a;行&#xff0c;字段&#xff08;属性&#xff09;&#xff1a;列&#xff0c;以行列的形式就组成了表&#xff08;数据存储在表中&#xff09;。 关系数…

Linux命令awk详细用法

简介 awk 是一种强大的文本处理工具&#xff0c;用于在命令行环境下对文件或数据流进行逐行处理和分析。它是由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在 1977 年开发的&#xff0c;并以他们三人的姓氏命名。awk 在 Unix/Linux 系统中非常常见&#xff0c;也有 Win…

ThingsKit物联网平台告警中心之告警配置

告警配置是指对告警联系人&#xff0c;告警通知方式进行配置。 新增 点击新增告警配置&#xff0c;填入相关信息和告警联系人。 告警配置参数参数说明告警配置名称 定义告警配置名称必填支持输入的格式&#xff1a;中英文、字符、数字支持输入的长度限制&#xff1a;30个字…

Python数据分析与展示-Numpy

numpy入门 ndarray对象的属性 import numpy as npdef sun():a np.array([1,2,3,4])b np.array([5,6,7,8])c a**2 b**3return cprint(sun())a np.array([[1, 2, 3, 4],[4, 5, 6, 7]])print(a.ndim) print(a.shape) print(a.size) print(a.dtype) print(a.itemsize) ndarra…

Zabbix配置SNMP trap告警的例子

官方文档&#xff1a;3 SNMP 陷阱 1、安装Trap组件包 yum install -y net-snmp-utils net-snmp-perl net-snmp 2、下载并复制接收Trap脚本 wget https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.4.15/zabbix-3.4.15.tar.gzyum -y install tartar z…

微信小程序发布一个npm包

参考:https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 同npm一样流程 npm install weixin_heath_apis

静态树提升对Vue生态系统的影响和发展

文章目录 1. 了解Vue 3的静态树提升介绍Vue 3的基本概念和优势解释静态树提升的作用和目标 2. 什么是静态树&#xff1f;解释静态树的概念和特点比较静态树和动态树的区别 3. Vue 3中的静态树提升解释Vue 3中静态树提升的原理和工作方式强调静态树提升对性能的影响和优化效果 4…

【Flutter】Flutter 使用 Shimmer 实现闪光效果的加载动画占位符

【Flutter】Flutter 使用 Shimmer 实现闪光效果的加载动画占位符 文章目录 一、前言二、为什么选择 shimmer 以及其安装和基本使用1. 闪光效果在 UI 设计中的价值2. shimmer 与其他类似工具的比较3. 如何在 Flutter 项目中安装 shimmer4. 基本使用方法和代码示例 三、深入了解 …

Krahets 笔面试精选 88 题——40. 组合总和 II

使用深度搜索的方法&#xff1a; 由于题目说候选数组中的每个数字在每个组合只能出现一次&#xff0c;所以&#xff0c;为了避免重复&#xff0c;在开始之前对候选数组进行升序排序&#xff0c;这样优先选择小的数&#xff0c;如果当前的数都小于目标值&#xff0c;则后面的数就…

Unity 之ToolTip的用法

文章目录 在Unity中&#xff0c;ToolTip是一个在编辑器中使用的UI元素&#xff0c;它提供了鼠标悬停在某个对象或控件上时显示的文本信息。ToolTip通常用于向开发人员提供有关对象、字段、控件或菜单项的附加信息&#xff0c;从而帮助他们更好地理解和使用这些元素。 ToolTip通…

常见变频器品牌-修改参数时的密码汇总

常见变频器品牌-修改参数时的密码汇总 1. 艾默生TD3000系列 密码:8888 2. 艾默生TD3300系列 密码:2002 3. 施耐德变频器 在SUP菜单下,找到COD选项进入,输入6969即可, 4. 台达变频器-B系列 密码:57522 5. 台达变频器-H系列 密码:33582 6. 台达S1系列 密码:57522

FIR滤波器算法

FIR&#xff08;Finite Impulse Response&#xff09;滤波器是一种基于有限长输入信号的数字滤波器&#xff0c;常用于去除数字信号中的噪声和干扰。其特点是具有线性相位响应&#xff0c;可以实现任意的频率响应和通带、阻带等设计参数。 FIR滤波器的数学模型描述如下&#x…