《剑指offer》——03. 数组中重复的数字——HashSet、哈希思想——java实现
文章目录:
- 1.题目描述
- 2.解决方案
- (1)HashSet方法解决
- (2)哈希思想(巧解)
- 3.参考
1.题目描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
2.解决方案
(1)HashSet方法解决
- 使用 HashSet 来进行处理,因为 HashSet 本身不允许出现重复元素,所以当添加元素失败或已经包含该数字时,则表示出现了重复元素,将其返回即可。
- 时间复杂度:O(n),空间复杂度:O(n)
- 时间复杂度为O(n),是因为有for循环
- 空间复杂度为O(n),是因为new HashSet()申请了空间
class Solution {public int findRepeatNumber(int[] nums) {Set<Integer> demo= new HashSet<>();for(int a: nums) {if(!demo.add(a)) {return a;}}return -1;}
}
(2)哈希思想(巧解)
- 所有数字都在 0 ~ n-1 的范围内,将每个位置的数交换映射到其对应的数组下标下面,当出现新的元素与其对应的下标中的数字相等时,即为重复数字
- 哈希的思想,数组本身做哈希表,达到了节省空间的目的
- while 循环,保证交换过来的新元素位置也要正确,即令:a[i]=i 。
- 时间复杂度:O(n),空间复杂度:O(1)
- 看图了解其过程:
class Solution {public int findRepeatNumber(int[] nums) {int len = nums.length;for (int i = 0; i < len; i++) {while (nums[i] != i) {//保证交换过来的新元素位置也要正确,即令:a[i]=i if (nums[i] == nums[nums[i]]) {//将每个位置的数交换映射到其对应的数组下标下面,当出现新的元素与其对应的下标中的数字相等时,即为重复数字return nums[i]; }int temp = nums[i]; //交换,使对应下标的数组值与其下标值相等,即令 a[i]=inums[i] = nums[temp];nums[temp] = temp;}}return -1;}
}
3.参考
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/hua-jie-suan-fa-mian-shi-ti-3-shu-zu-zhong-zhong-f/
《剑指offer》——03. 数组中重复的数字——HashSet、哈希思想——java实现相关推荐
- Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)
找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...
- 【三种解法实现】剑指 Offer 03. 数组中重复的数字
立志用最少的代码做最高效的表达 题目链接-->传送门 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数 ...
- leetcode 剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 【算法】剑指 Offer 03. 数组中重复的数字
1.概述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
- leetcode 剑指 Offer 03. 数组中重复的数字 抽屉原理 一个萝卜一个坑
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 剑指 Offer 03. 数组中重复的数字()
在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 解题思路 原 ...
- 【LeetCode笔记】剑指 Offer 03. 数组中重复的数字(Java、哈希表、原地算法)
文章目录 题目描述 思路 & 代码 二刷 题目描述 倒是和leetcode 287 寻找重复数很像..但是不能使用那道题的快慢指针法(也可能是我太菜了) 重点在于题干的描述[长度为 n 的数组 ...
- LeetCode-剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 思路一:先排序,然后找到最近的两个相邻的一样数返回 class Solution {public:int findRepeatNumber(vector&l ...
- Python剑指offer:数组中重复的数字
题目一:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...
- 《剑指offer》数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的 ...
最新文章
- Linux 服务器日志文件查找技巧精粹
- STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
- CSS 盒子的边距塌陷
- 使用UEFI Shell引导U盘启动
- OJ8462-大盗阿福【各种dp之5】
- Windows Server 2003 下安装Apache+Php+Mysql
- 关于灵魂安放,年轻人如何选择适合自己的城市呢?学长有话说
- OpenGL Tutorial
- mySql 查询当天、本周、最近7天、本月、最近30天的语句
- Linux 用户及权限详解
- XML (4) XSL教程
- JDK中的SPI和Spring中的SPI
- DNF2020年全新脚本展示第三部分
- 【Ware】C++编程软件
- 网页特效——花间飞舞的蝴蝶
- 百度图片翻译API,对开发者真的很友好
- Microsoft SQL Server Native Client(sqlncli.msi)的安装程序包
- 编程帮助小明计算地铁票价(C++)
- AD17-SchDoc(原理图基础)
- 起重吊装资质证书如何办理通过?经验之谈