[LeetCode]剑指 Offer 03. 数组中重复的数字

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 03. 数组中重复的数字相关的知识,希望对你有一定的参考价值。

找出数组中重复的数字。

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

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

限制:

2 <= n <= 100000

题解一:

    /**
     * 剑指 Offer 03. 数组中重复的数字
     *
     * @param nums 数组
     * @return 重复的数字
     */
    public int findRepeatNumber(int[] nums) 
        // 利用 Java Set 集合的无序不重复性依次将数组的元素加入到 set 中
        // 加入失败则找到题目所要求的重复数字
        Set<Integer> set = new HashSet<>();
        for (int num : nums) 
            if (!set.add(num)) 
                return num;
            
        
        return -1;
    

题解二:

    /**
     * 剑指 Offer 03. 数组中重复的数字
     *
     * @param nums 数组
     * @return 重复的数字
     */
    public int findRepeatNumber(int[] nums) 
        /*
         * 原地交换:题目声明在长度为 n 的数组 nums 中所有的数字都在 0 ~ n-1 内,
         * 那么在不存在数字重复的情况下,所有数字与其对应数组下标为一对一关系,
         * 利用此特点遍历数组让对应的数字 “归位”,若归位过程中与归位位置上元素值相等,
         * 则找到了重复的数字,直接返回
         */
        int len = nums.length;
        for (int i = 0; i < len; i++) 
            int curIndexVal = nums[i];
            // 当前索引值与存放的元素值相等,无需归位
            if (i == curIndexVal) 
                continue;
            
            // 在索引为 curIndexVal 的位置上已经存放元素 curIndexVal,则当前数字重复
            if (nums[curIndexVal] == curIndexVal) 
                return nums[i];
            
            // 归位:将索引为 curIndexVal 的位置上的元素值与当前位置元素值进行交换
            nums[i] = nums[curIndexVal];
            nums[curIndexVal] = curIndexVal;
            // 重新从当前位置开始判断
            --i;
        
        return -1;
    

以上是关于[LeetCode]剑指 Offer 03. 数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(剑指 Offer)- 03. 数组中重复的数字

[LeetCode]剑指 Offer 03. 数组中重复的数字

[LeetCode]剑指 Offer 03. 数组中重复的数字

剑指 Offer 03. 数组中重复的数字(leetcode每日打卡)

Leetcode刷题Python剑指 Offer 03. 数组中重复的数字

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)