剑指offer-03.数组中重复的数字

找出数组中重复的数字

Posted by codeSu on Sunday, October 23, 2022

题目内容

找出数组中重复的数字。

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

  • 示例1:

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

    • 2 <= n <= 100000

解题思路

哈希表

  1. 定义一个哈希表set
  2. 遍历数组nums,每个数字为num
    1. 如果numset中,说明num重复,直接返回num
    2. 如果num不在set中,set添加num
  3. 没有重复的,返回-1

原地交换

  1. 遍历数组nums,依照索引下标
    1. nums[i] = i : 说明此数字已在对应索引位置,无需交换,因此跳过
    2. nums[nums[i]] = nums[i] : 代表索引 nums[i] 处和索引 i 处的元素值都为 nums[i] ,即找到一组重复值,返回此值 nums[i]
    3. 否则,交换 索引 inums[i] 的值,即 nums[nums[i]] = nums[i], nums[i] = nums[nums[i]]
  2. 遍历完还没有重复项,则返回 -1

代码解法

Java

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

Python

from typing import List


class Solution:
    # 哈希表,判断是否存在
    def findRepeatNumber(self, nums: List[int]) -> int:
        map = set()
        for num in nums:
            if num in map:
                return num
            map.add(num)
        return -1

    # 原地交换
    def findRepeatNumber2(self, nums: List[int]) -> int:
        i = 0
        while i < len(nums):
            if nums[i] == i:
                i += 1
                continue
            if nums[nums[i]] == nums[i]:
                return nums[i]
            nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1