剑指Offer(3)数组中重复的数字

目录

数组中重复的数字

描述

示例 1

限制

方法一:Map键值对

方法二:原地交换法


数组中重复的数字

描述

找出数组中重复的数字。

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

示例 1

输入

[2, 3, 1, 0, 2, 5, 3]

输出

2 或 3 

限制

2 <= n <= 100000

方法一:Map键值对

我们利用Map集合的特性,将所有元素依次放入map集合中,当集合中有该元素时,将元素返回即可。

class Solution {
    public int findRepeatNumber(int[] nums) {
        Map<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])){
                return nums[i];
            }else{
                map.put(nums[i],1);
            }
        }
        return -1;
    }
}

 同样也可以利用set集合的特性,set不允许值重复,所以依次添加元素,如果添加失败证明该元素重复,但是其用时较短,

方法二:原地交换法

通过调整数组内元素位置,使数组变成当前下标存放的值就是下标数,在调整交换的过程中,如果一个数字出现在相同下标处,则判定为重复数字。(利用题目长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内这个特点),通俗来讲就是元素3要放在arr[3]这个位置。

class Solution {
    public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (i==nums[i]){
                continue;
            }else{
                if (nums[nums[i]]==nums[i]){//如果该位置的元素和下标值相等,证明和当前元素重复了
                    return nums[i];
                }else{
                    int temp=nums[nums[i]];
                    nums[nums[i]]=nums[i];
                    nums[i]=temp;
                    i--;//交换完后继续看交换过来的元素应该要放在哪里
                }
            }
        }
        return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120458199
今日推荐