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)

 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)

 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 ( 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

 提交结果如下:


发布了68 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JR_Chan/article/details/105532106