返回

LeetCode 刷题记录:剑指 Offer 03. 数组中重复的数字

后端

找到一个数字,它在数组中重复出现。请注意,我们使用的是“查找一个数字”这个概念,而不是“找出重复数字”。换句话说,你需要找到数组中的一个数字,而不是找出所有的重复数字。

解决方案:

方法一:哈希表

时间复杂度:O(n)。

空间复杂度:O(n)。

import java.util.HashSet;
import java.util.Set;

class Solution {
    /**
     * 剑指 Offer 03. 数组中重复的数字
     *
     * @param nums 整数数组
     * @return 重复出现的数字
     */
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)) {
                return num;
            }
            set.add(num);
        }
        return -1;
    }
}
def find_repeat_number(nums):
    """
    剑指 Offer 03. 数组中重复的数字

    :param nums: 整数数组
    :return: 重复出现的数字
    """
    seen = set()
    for num in nums:
        if num in seen:
            return num
        seen.add(num)
    return -1

方法二:原地交换

时间复杂度:O(n)。

空间复杂度:O(1)。

class Solution {
    /**
     * 剑指 Offer 03. 数组中重复的数字
     *
     * @param nums 整数数组
     * @return 重复出现的数字
     */
    public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                // 交换nums[i]和nums[nums[i]]
                int temp = nums[i];
                nums[i] = nums[nums[i]];
                nums[nums[i]] = temp;
            }
        }
        return -1;
    }
}
def find_repeat_number(nums):
    """
    剑指 Offer 03. 数组中重复的数字

    :param nums: 整数数组
    :return: 重复出现的数字
    """
    for i in range(len(nums)):
        while nums[i] != i:
            if nums[i] == nums[nums[i]]:
                return nums[i]
            # 交换nums[i]和nums[nums[i]]
            temp = nums[i]
            nums[i] = nums[nums[i]]
            nums[nums[i]] = temp
    return -1

总结:

在这道题中,我们提供了两种方法来解决问题:哈希表和原地交换。哈希表的方法简单易懂,但空间复杂度较高。原地交换的方法空间复杂度较低,但算法实现稍微复杂一些。