• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
有志青年123
博客园    首页    新随笔    联系   管理    订阅  订阅
2023.3.16晚报

1.Englisg learning one hour

2.算法

  1.找最多数   大致意思:一个数组总会出现一个最多数,最多数判断依据 大于数组的1/2(js)

  思路a:先设定一个空的object,开始遍历数组,在遍历数组时以数组值为key,第一次遇见key时初始化value=1,以后每次遇见+=1;此时在+=1后判断value>= length/2;

      代码:

     打败了78%的人!!!!

function maxValue(nums){
    let dic = {};
    for(let i of nums){
        if(!dic[i]){
            dic[i] = 1;
        }else{
            dic[i]+=1;
            if (dic[i]>Math.floor(nums.length/2)){
                return i
            }
        }
    }
}
let a  = maxValue([1,2,2])
console.log(a)
这种方法时间复杂度为o(n)最坏的情况需要遍历一遍数组
测试数据【1,2,2】

 

b:投票法:思路设定两个指针indexA,pointB,初始话使indexA指向nums【0】,设定一个value值为当前A出现的次数,B指针依次遍历数组,当俩个指针的数不一样的时候value-1,如果value<=0,则将A指针指向当前B的位置。

 

这个方法我感觉不如第一个方法:理由如下无论什么情况都需要遍历一遍完整的数组时间上可能会稍逊于第一个方法,但是这个方法没有占用第一个方法需要的object空间,只用了额外的两个空间,实际操作上遍历的指针可以不需要,只额外用了一个指针空间

代码:

function maxValue(nums){
    let IndexA = nums[0];
    let value = 0;
    let num = nums.length-1
   for(let i= 0;i<=num;i++){
    if(nums[i] !== IndexA){
        value-=1;
        if(value<=0){
            IndexA = nums[i];
            value = 1;
        }
    }else{
        value+=1;
    }
   }
   return IndexA
}
nums = [1]
let a  = maxValue(nums)
console.log(a)

 结果:

 

 这个测试数据边界测试哈哈哈!!!

第二个题:只出现一次数字,在一个数组中其余数字都出现两次,只有一个数组出现一次,找到并返回这个数组

1.异或=》贼好用

2.构建一个object,检测到数字第一次出现初始化并设置value=1,第二次出现则移除object中的这个key,最后数组中只剩下一个值return Object.keys(object),完美,

只需要遍历一遍且占用空间为n/2  但是这个解法在leetcode只战胜了20%的人,呜呜呜!

代码不写了,太晚了

第三道题:三数之和(经典)

1.目前想到的解法 放到明天吧

 

 

 

总结:今天没看vue,目前正在搭建一个个人网站,等搭好了转移阵地!!!

 

posted on 2023-03-16 23:51  有志青年123  阅读(18)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3