前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《剑指offer》数组中出现次数超过数组长度一半的数字

《剑指offer》数组中出现次数超过数组长度一半的数字

作者头像
ConardLi
发布2019-05-23 22:34:40
5510
发布2019-05-23 22:34:40
举报
文章被收录于专栏:code秘密花园code秘密花园

本系列是《剑指offer》或leetcode的JavaScript版本。 每期1-2个算法,也有可能是一个类别。 文章包括题目、思路以及代码。 如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。

题目

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

代码

解法1: 开辟一个额外空间存储每个值出现的次数,时间复杂度最大为O(n),逻辑简单

代码语言:javascript
复制
function MoreThanHalfNum_Solution(numbers) {
      if (numbers && numbers.length > 0) {
        var length = numbers.length;
        var temp = {};
        for (var i = 0; i < length; i++) {
          if (temp['s' + numbers[i]]) {
            temp['s' + numbers[i]]++;
          } else {
            temp['s' + numbers[i]] = 1;
          }
          if (temp['s' + numbers[i]] > length / 2) {
            return numbers[i];
          }
        }
        return 0;
      }
    }

解法2:

目标值的个数比其他所有值加起来的数多

记录两个变量 1.数组中的某个值 2.次数

1.当前遍历值和上一次遍历值相等?次数+1 : 次数-1。

2.次数变为0后保存新的值。

3.遍历结束后保存的值,判断其是否复合条件 事件复杂度O(n) 不需要开辟额外空间 , 逻辑稍微复杂。

代码语言:javascript
复制
function MoreThanHalfNum_Solution(numbers) {
      if (numbers && numbers.length > 0) {
        var target = numbers[0];
        var count = 1;
        for (var i = 1; i < numbers.length; i++) {
          if (numbers[i] === target) {
            count++;
          } else {
            count--;
          }
          if (count === 0) {
            target = numbers[i];
            count = 1;
          }
        }
        count = 0;
        for (var i = 0; i < numbers.length; i++) {
          if (numbers[i] === target) count++;
        }
        return count > numbers.length / 2 ? target : 0;
      }
    }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档