leetcode-数组中重复的数字

 题目来自LeetCode,链接:面试题03. 数组中重复的数字。具体描述为:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。限制:

  • 2 <= n <= 100000

 示例:

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

 很简单,可以直接用set来判断重复。这种方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

 JAVA版代码如下:

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set set = new HashSet();
        for (int n : nums) {
            if (!set.add(n)) {
                return n;
            }
        }
        return 0;
    }
}

在这里插入图片描述
 提交结果如下:


 然后也可以不用set,因为数字的范围为0~n-1,所以用一个长度为n的数组visited来标识一个数字是否出现,也就是如果在遍历过程中发现visited[i]==true就可以直接返回i了。时间复杂度就是 O ( n ) O(n) O(n),空间复杂度也是 O ( n ) O(n) O(n)

 JAVA版代码如下:

class Solution {
    public int findRepeatNumber(int[] nums) {
        boolean[] visited = new boolean[nums.length];
        for (int n : nums) {
            if (visited[n]) {
                return n;
            }
            visited[n] = true;
        }
        return 0;
    }
}

 提交结果如下:


 最后还是从评论区看到的另一种原地置换的方法。具体的做法就是在遍历到nums[i]nums[i]!=i的时候,我们将索引nums[i]i上的数给换个位置,也就是我们想让数字nums[i]给放到索引nums[i]上去,所以啥时候可以发现一个重复的数字呢,没错,就是nums[i]==nums[nums[i]]的时候。时间复杂度还是 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

 JAVA版代码如下:

class Solution {
    public int findRepeatNumber(int[] nums) {
        int temp;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                temp = nums[i];
                nums[i] = nums[nums[i]];
                nums[temp] = temp;
            }
        }
        return 0;
    }
}

 提交结果如下:


 Python版代码如下:

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

 提交结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值