LeetCode题解:剑指offer03-数组中重复的数字

题目地址:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

题目描述:

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

示例:

LeetCode题解:剑指offer03-数组中重复的数字_第1张图片

数据限制:

问题分析:

这道题从难度上来说是简单题,写这篇博客的动机是回顾之前做过的题,虽然是简单题,但是也能起到温故知新的作用。

解决这种寻找重复值的问题,最基本的工具就是set或者map,set可以用来判断是否重复,而map可以进一步记录重复的次数。

注意题目这里说是只需要找到任意一个重复的数字即可,也不需要具体统计重复的次数,一个简单的直观的思路就是遍历数组,当set中不含该数字时,将该数字添加到set中,set中含有这个数字时,直接返回这个数字即可,代码如下:

class Solution {
    public int findRepeatNumber(int[] nums) {

        Set numSet = new HashSet();
        int res = 0;

        for (int i = 0; i < nums.length; i++) {
            if (numSet.contains(nums[i])){
                res = nums[i];
                break;
            }else{
                numSet.add(nums[i]); 
            }
        }

        return res;
    }
}

由于是简单题,我们不妨进一步想一下,是否可以获取到所有重复的数字,然后从中挑选一个返回。如果还是使用set作为载体,需要转变一下策略,先判断一个数字是否是重复的,如果是重复的,再将其加入set中,这样遍历之后set中保存的就是所有重复的数字。可以使用原地排序的方法,这样重复的数字便挨在一块,方便进行判断,代码如下:

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set numSet = new HashSet();
        Arrays.sort(nums);  // 原地排序

        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i-1]){
                numSet.add(nums[i]);
            }
        }

        return (int)numSet.toArray()[0];  // 题目要求的是任意一个,所以返回第一个就行
    }
}

前面提到过还可以使用map记录数据,让key表示原数组中的值,value表示出现的次数,最后可以得到所有的数字以及对应出现的次数,至于如何得到重复的数字,只需要在对map的value进行修改是,用一个变量基础对应的key即可,这种方法实际上记录的是最后一个重复的数字,但是也是符合题目的要求的,代码如下:

public class RepeatNumber3 {

    public int findRepeatNumber(int[] nums) {

        Map map = new HashMap<>();
        int res = 0;

        // 将数组中的内容放入set,放之前检查时候含有这个数字,如果有,则返回这个数组
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])){
                map.put(nums[i], map.get(nums[i])+1 );
                res = nums[i];   // 这里记录的nums[i]就是重复的数字
            }else{
                map.put(nums[i], 1 );
            }
        }

        return res;
    }
}

 

你可能感兴趣的:(OJ平台刷题系列,算法,java,leetcode)