高频考题!数组中找重复数字(算法 NO.1)

本题来自 LeetCode 中国网站,属于算法面试中的一道经典高频考题。题解由 Doocs 开源社区 leetcode 项目维护者提供。

目前已经有超过 50 位开发者参与了此项目,期待你的加入!

项目地址:https://github.com/doocs/leetcode

高频考题!数组中找重复数字(算法 NO.1)_第1张图片

题目描述

找出数组中重复的数字。

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

示例 1:

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

限制:

2 <= n <= 100000

解法

0~n-1 范围内的数,分别还原到对应的位置上,如:数字 2 交换到下标为 2 的位置。

若交换过程中发现重复,则直接返回。

Python3

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        for i, num in enumerate(nums):
            while i != num:
                if num == nums[num]:
                    return num
                nums[i], nums[num] = nums[num], nums[i]
                num = nums[i]
        return -1

Java

class Solution {
    public int findRepeatNumber(int[] nums) {
        for (int i = 0, len = nums.length; i < len; ++i) {
            while (i != nums[i]) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                swap(nums, i, nums[i]);
            }
        }
        return -1;
    }
    private void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

长按识别下图二维码,关注公众号「Doocs开源社区」,第一时间跟你们分享好玩、实用的技术文章与业内最新资讯。

你可能感兴趣的:(高频考题!数组中找重复数字(算法 NO.1))