TypechoJoeTheme

Toasobi的博客

找出数组重复的数字(简单)

本文最后更新于2023年03月03日,已超过566天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

自己写的是很简单的双层循环,这个在时间上复杂度太高,但是内存占用意外的小

看看不同的题解:

=======================

- 方法一:遍历数组

由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。

这个也是我一开始想到的,但是不知道用什么存储比较的数字,于是便使用了双层循环

这里使用了不可重复的set集合(重复存储返回false)来存储,使用集合存储已经遇到的数字,如果遇到的一个数字已经在集合中,则当前的数字是重复数字。以空间换取时间

<div>
//哈希表实现
class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for (int num : nums) {
            if (!set.add(num)) {
                repeat = num;
                break;
            }
        }
        return repeat;
    }
}
 //set底层就是hashmap,add调用了put方法,添加相同元素返回false,当然set.contains(num)也可以用
</div>

=======================

- 方法二:排序后判断前后位置元素是否相等

核心:
nums = Arrays.stream(nums).sorted().toArray()

<div>
class Solution {
    public int findRepeatNumber(int[] nums) {
        nums = Arrays.stream(nums).sorted().toArray(); //注意这一行以后的刷题可能用的比较多
        for(int i = 0;i<nums.length -1; i++) {
            if( nums[i] == nums[i+1]) return nums[i];
        }
        return -1;
    }
}
</div>

=======================

- 方法三:(最好)索引下标换位匹配法

因为题目所给:在一个长度为n的数组nums中的所有数字都在0~n-1的范围内,因此数组元素的索引和值是一对多的关系。即可先通过元素对调使元素的值和下标一一对应,一个下标对应两个值则是重复

<div>
class Solution {
    public int findRepeatNumber(int[] nums) {
       int i= 0, tmp;

        while (i<nums.length) {
            if(nums[i] == i) {
                i++;
                continue;
            }
            if(nums[nums[i]] == nums[i]) return nums[i];
            tmp = nums[i];
            nums[i] = nums[tmp];
            nums[tmp] = tmp;
        }
        return -1;
    }
}
</div>
朗读
赞(0)
评论 (0)