数组中重复的数字

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

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

Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。实际上Set就是Collection只是行为略有不同(Set不允许包含重复元素)。
Set集合不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。

题解

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

方法二:原地交换 巧解

在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内,数字有重复的,
如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回ture,没有重复就是012345-012345
image.png
首先遍历数组,判断当前索引号对应的值是不是和索引号相对应,
如果对应则直接进行下一次循环
如果不对应判断当前索引号对应的值和索引号对应的值的索引号对应的值是否相同,如果相同则说明出现重复元素,返回,如果不同则进行原地交换,再判断当前索引号对应的值是不是和索引号相对应,如果不是继续上面的流程,如果对应则进入下一次循环。相当于把后面的元素依次交换来,把最重要的交换到当前索引位置)
23012->03212->01232->01232->01232->发现重复的2.因为nums[4] = 2,nums[nums[4]]= 2,发现重复的就返回,因为前面已经按照顺序排列好了!
image.png


Loccy
4 声望1 粉丝