关于java:offer-03-数组中重复的数字

21次阅读

共计 975 个字符,预计需要花费 3 分钟才能阅读完成。

数组中反复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范畴内。数组中某些数字是反复的,但不晓得有几个数字反复了,也不晓得每个数字反复了几次。请找出数组中任意一个反复的数字。

看到题目中找到反复数字就要想到 set 汇合不容许有反复元素!!从而利用 hashset 进行算法计算。hashset 底层数据结构是哈希表

Set 汇合相似于一个罐子,程序能够顺次把多个对象“丢进”Set 汇合,而 Set 汇合通常不能记住元素的增加程序。实际上 Set 就是 Collection 只是行为略有不同 (Set 不容许蕴含反复元素)。
Set 汇合 不容许蕴含雷同的元素 ,如果试图把两个雷同元素退出同一个 Set 汇合中,则增加操作失败,add() 办法返回 false,且新元素不会被退出。

题解


创立一个整数型 hashset 汇合
contains 判断汇合中是否有这个元素
如果有这个元素 返回 true 则将这个元素作为返回值返回,
如果没有这个元素,则将这个元素加到汇合中,再对下一元素进行判断
或者用 add add 不进去就阐明反复了,add 反复元素返回值是 false!
就是遍历数组中元素,如果是新元素就加到 set 汇合,不是就返回,就达到目标了,因为 set 汇合不能 add 反复元素。

办法二:原地替换 巧解

在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范畴内,数字有反复的,
如果没有反复数字,那么失常排序后,数字 i 应该在下标为 i 的地位,所以思路是重头扫描数组,遇到下标为 i 的数字如果不是 i 的话,(假如为 m), 那么咱们就拿与下标 m 的数字替换。在替换过程中,如果有反复的数字产生,那么终止返回 ture,没有反复就是 012345-012345

首先遍历数组,判断以后索引号对应的值是不是和索引号绝对应,
如果对应则间接进行下一次循环
如果不对应判断以后索引号对应的值和索引号对应的值的索引号对应的值是否雷同,如果雷同则阐明呈现反复元素,返回,如果不同则进行原地替换,再判断以后索引号对应的值是不是和索引号绝对应,如果不是持续下面的流程,如果对应则进入下一次循环。相当于把前面的元素顺次替换来,把最重要的替换到以后索引地位)
23012->03212->01232->01232->01232-> 发现反复的 2. 因为 nums[4] = 2,nums[nums[4]]= 2, 发现反复的就返回,因为后面曾经依照顺序排列好了!

正文完
 0