力扣题解:961. 在长度 2N 的数组中找出重复 N 次的元素

81 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

题目描述

961. 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode)

给你一个整数数组 nums ,该数组具有以下属性:

  • nums.length == 2 * n.
  • nums 包含 n + 1 个 不同的 元素
  • nums 中恰有一个元素重复 n 次

找出并返回重复了 n 次的那个元素。

 

示例 1:

输入:nums = [1,2,3,3]
输出:3

示例 2:

输入:nums = [2,1,2,5,3,2]
输出:2

示例 3:

输入:nums = [5,1,5,2,5,3,5,4]
输出:5

提示:

  • 2 <= n <= 5000
  • nums.length == 2 * n
  • 0 <= nums[i] <= 10^4
  • nums 由 n + 1 个 不同的 元素组成,且其中一个元素恰好重复 n 次

思路分析

将输入的数组顺序排序后,因为共有2n个元素,除了重复的数字x之外,其余的数字均为重复,则归纳为3种情况:

  1. 重复的数字最小,即在排序的列表元素中,前n个元素均为x,即列表的第n个数字为x,n+1个为非x元素
  2. 重复的数字最大,即在排序的列表元素中,第n+1个元素到第2n个元素均为x,即列表的第n+1个数字为x,第n-1个为非x元素
  3. 重复的数字既不是最大也不是最小,则顺序排列后的列表中,第n个和n+1个数字必然都是x

AC 代码

class Solution:
    def repeatedNTimes(self, nums: List[int]) -> int:
        nums = sorted(nums)
        check_n = len(nums)//2-1
        if nums[check_n] != nums[check_n+1] and nums[check_n+2] == nums[check_n+1]:
            return nums[check_n+1]
        else:
            return nums[check_n]
        

参考

java,用 map 存储数字和出现的次数,遍历 map,找到出现 n 次的数字 - 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode)

961. 在长度 2N 的数组中找出重复 N 次的元素 - 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode)