每日一题——LeetCode961

方法一 排序法:

2*n长度的数组里面有一个元素重复了n次,那么将数组排序,求出排序后数组的中间值(因为长度是偶数,没有刚好的中间值,默认求的中间值是偏左边的那个)那么共有三种情况:

  1. 重复n次的元素为最小值那么数组前一半都是该元素,此时中间值也是该元素
  2. 重复n次的元素为最大值,那么数组后一半都是该元素,此时中间值后面一个就是该元素
  3. 既不是最大值也不是最小值,那么中间值也一定就是该元素
javascript 复制代码
var repeatedNTimes = function(nums) {
    nums.sort((a,b)=>a-b)
    var mid = Math.floor((nums.length-1)/2)
    if(nums[mid]===nums[mid-1] || nums[mid]===nums[mid+1])
        return nums[mid]
    else if(nums[mid+1]===nums[mid+2]) 
        return nums[mid+1]
};

消耗时间和内存情况:

方法二 Map集合

用map记录nums里的各元素各出现了多少次,出现了n次即可返回

javascript 复制代码
var repeatedNTimes = function(nums) {
    var len = nums.length/2
    var map = new Map()
    for(let n of nums){
        if(map.has(n)){
            map.set(n,map.get(n)+1)
            if(map.get(n)===len) return n
        }else{
            map.set(n,1)
        }
    }
};

消耗时间和内存情况:

方法三 数学方法:

考虑重复元素x在nums中出现的位置;

如果相邻的x之间至少都隔了2个位置,那么数组的总长度至少为:n+2(n-1)=3*n - 2

当n>2时,3n-2 > 2n 不存在满足要求的数组。因此一定存在两个相邻的x,它们的位置是连续的,或者只隔了1个位置

当n=2时,数组的长度最多为2n=4,因此最多只能隔2个位置。

所以我们只需要遍历所有间隔2个位置及以内的小标对,判断对应的元素是否相等即可

javascript 复制代码
var repeatedNTimes = function(nums) {
   const n = nums.length;
    for (let gap = 1; gap <= 3; ++gap) {
        for (let i = 0; i + gap < n; ++i) {
            if (nums[i] === nums[i + gap]) {
                return nums[i];
            }
        }
    }
    // 不可能的情况
    return -1;
};
相关推荐
dsyyyyy11014 小时前
JavaScript变量
开发语言·javascript·ecmascript
‎ദ്ദിᵔ.˛.ᵔ₎4 小时前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾5 小时前
多头注意力机制
人工智能·深度学习·算法
H178535090965 小时前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
kyriewen5 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
hujinyuan201605 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
bIo7lyA8v6 小时前
算法复杂度评估的实验统计方法与可视化的技术8
算法
李老师讲编程6 小时前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
胡志辉的博客6 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖6 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js