LeetCode题解 => 961.重复N次的元素(三十五)

重复N次的元素

一、LeetCode题解

瞧一瞧~
做题路线( ** =当前阶段)
  • 阶段一(解题总数,单题题解数至上)**
  • 阶段二(解题质量至上)
  • 阶段三(算法思想至上)

二、算法题

题目

在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。
返回重复了 N 次的那个元素。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 4 <= A.length <= 10000
  • 0 <= A[i] < 10000
  • A.length 为偶数

解法一 (HashMap)

key-value的方式,查询的时间复杂度是O(1),一般需要元素的个数的场景时,都可以将HashMap的方式考虑进去。

  • 对数组的数字进行统计
  • 找到个数符合要求的那个元素
  • 时间复杂度O(N)、空间复杂度O(N)

注意

  • 在本题,仅有一个元素 出现N次 但是数组内总共N+1中元素,可以得出(2N - (N*1) ) / (N+1-1) = 1
  • 即剩下的元素均仅出现一次
var repeatedNTimes = function(A) {
    var obj = {}
    A.forEach(item => {
        if(obj[item]){
            obj[item]++
        }else{
            obj[item] = 1 
        }
    });// 对数组的元素进行计数
    for(key in obj){
        if(obj[key] === A.length/2) return key
        // if(obj[key] > 1) return key
    }
};

在这里插入图片描述

解法二(排序)

  • 对数组进行排序,
var repeatedNTimes = function(A) {
    var arr = A.sort((a, b)=>{
        return a - b
    })
    for(let i = 0; i < arr.length; i++){
        if(arr[i] === arr[i+1]) return arr[i]
    }
};

在这里插入图片描述

解法三(数学思想)

  • 抽取题干提供的信息,2N个元素的数组,有一个元素出现了N次(数组的一版)
  • 将数组排序
  • 数组的前半部分 mid = (arr.length/2) -1
  • arr[mid] !== arr[mid-1] //如果与前一位不等,那么一定与后一位相等

var repeatedNTimes = function(A) {
    var arr = A.sort((a, b)=>{
        return a-b
    })
    var mid = Math.floor(arr.length/2)-1 // 获取数组的中间值 例如 [1,2,2,3] 获取到的是第一个2,
    if(arr[mid] == arr[mid-1])return arr[mid] // 向前比较
    return arr[mid+1]
};

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页