重复N次的元素
一、LeetCode题解
瞧一瞧~
- 博健的LeetCode题解:Gitbook版本传送门
- 博健的LeetCode题解:CSDN传送门
- 有趣的CSS:Gitbook传送门
- 前端进阶笔记:Gitbook传送门
做题路线( ** =当前阶段)
- 阶段一(解题总数,单题题解数至上)**
- 阶段二(解题质量至上)
- 阶段三(算法思想至上)
二、算法题
题目
在大小为 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]
};