文章目录:

  • 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实现相关推荐

  1. Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)

    找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...

  2. 【三种解法实现】剑指 Offer 03. 数组中重复的数字

    立志用最少的代码做最高效的表达 题目链接-->传送门 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数 ...

  3. leetcode 剑指 Offer 03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  4. 【算法】剑指 Offer 03. 数组中重复的数字

    1.概述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  5. leetcode 剑指 Offer 03. 数组中重复的数字 抽屉原理 一个萝卜一个坑

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  6. 剑指 Offer 03. 数组中重复的数字()

    在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 解题思路 原 ...

  7. 【LeetCode笔记】剑指 Offer 03. 数组中重复的数字(Java、哈希表、原地算法)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 倒是和leetcode 287 寻找重复数很像..但是不能使用那道题的快慢指针法(也可能是我太菜了) 重点在于题干的描述[长度为 n 的数组 ...

  8. LeetCode-剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 思路一:先排序,然后找到最近的两个相邻的一样数返回 class Solution {public:int findRepeatNumber(vector&l ...

  9. Python剑指offer:数组中重复的数字

    题目一:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...

  10. 《剑指offer》数组中重复的数字

    题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的 ...

最新文章

  1. Linux 服务器日志文件查找技巧精粹
  2. STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
  3. CSS 盒子的边距塌陷
  4. 使用UEFI Shell引导U盘启动
  5. OJ8462-大盗阿福【各种dp之5】
  6. Windows Server 2003 下安装Apache+Php+Mysql
  7. 关于灵魂安放,年轻人如何选择适合自己的城市呢?学长有话说
  8. OpenGL Tutorial
  9. mySql 查询当天、本周、最近7天、本月、最近30天的语句
  10. Linux 用户及权限详解
  11. XML (4) XSL教程
  12. JDK中的SPI和Spring中的SPI
  13. DNF2020年全新脚本展示第三部分
  14. 【Ware】C++编程软件
  15. 网页特效——花间飞舞的蝴蝶
  16. 百度图片翻译API,对开发者真的很友好
  17. Microsoft SQL Server Native Client(sqlncli.msi)的安装程序包
  18. 编程帮助小明计算地铁票价(C++)
  19. AD17-SchDoc(原理图基础)
  20. 起重吊装资质证书如何办理通过?经验之谈

热门文章

  1. 设置背景图片,解决手机上背景图片高度适应问题
  2. 110余家企业聚集智博会 专家表示智慧城市需以打破数据堡垒为前提
  3. Sandcastle是微软提供的一个根据XML注释和DLL文件生成帮助文件的工具
  4. 监控软件nagios之安装
  5. Ruby之旅—Ruby的Hello World
  6. Q:一个经典的helloworld程序需要几个文件?
  7. pytorch中的切片时的省略号
  8. 推荐 7 个 Github 上近 200k Star 的计算机学习资源,练好前端内功的秘籍!
  9. leetcode 遇到的问题
  10. linux fedora35禁用或启用仓库