当前位置: 首页 > news >正文

[LeetCode] NO. 169 Majority Element

[题目] 

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

 

[题目解析] 根据题目需要求数组中,出现次数过半的元素。最容易想到的就是直接的去遍历数组计数,然后出现次数过半的即为所求。

 public int majorityElement(int[] nums) {
       int result = 0;
       HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
       for(int i = 0; i < nums.length; i++){
           int num = nums[i];
           if(map.containsKey(num)){
               map.put(num, map.get(num) + 1);
           }else{
               map.put(num,1);
           }
           f(map.get(num) > (nums.length)/2){
               result = num;
           }
       }
       return result;
  }

还有没有其他方法呢?比较容易能想到,如果是一个有序数组,那么中间位置的数一定就是所求。我们可以对数组进行排序。

    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }

这里用到了排序,其实我们如果求第(n/2)+1小的数,也是可以的。问题就转化成,求第i小的数。

        求第i小的数,可以根据快速排序的思想。快速排序是找一个数作为基准数,一次遍历后令该基准数处于最终排序后的位置,即比它小的数都在左边,大的都在右边。我们可以根据这一思想,随机取一个数,根据该方法求得最终位置后,若该位置即为i,则直接返回。若该位置比i大,则要求的数在i的左边的数组中,转化为子问题。若该位置比i小,则问题转化成求i右边的数组的第i-s小的数(s是该位置左边的元素个数)。最终可求得结果。

        此外,有一种比较巧妙的方法来解决该问题:摩尔投票算法。

        基本思想: 遍历数组,每次删除一对不同的数,则最后剩下的元素即为所求。

        

  public int majorityElement(int[] nums) {
        int ret = 0; 
        int count = 0;
        for(int num : nums){
            if(count == 0){
                ret = num;
            }
            if(ret == num){
                count++;
            }else{
                count--;
            }
        }
        return ret;
    }

 

转载于:https://www.cnblogs.com/zzchit/p/5782497.html

相关文章:

  • apache添加 扩展php自定义的项目配置方法
  • 实现携程X分钟前有人预定功能
  • 怎么让块级元素水平和垂直都居中
  • 百度实习面经-JAVA研发方向
  • P1143 飘飘乎居士的约会
  • 让win7变成无线路由(需要用管理员权限打开)最后完善.rar
  • mysql 在大型应用中的架构演变
  • android 在布局中动态添加控件
  • JdbcTemplate+PageImpl实现多表分页查询
  • python os.path
  • 全国开设艺术类专业的211、985工程院校汇总
  • 优先队列的用法
  • 如何保持响应式设计新鲜感
  • 设计模式之Iterator模式
  • hbase rowkey设计的注意事项
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【个人向】《HTTP图解》阅后小结
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • flask接收请求并推入栈
  • Javascript设计模式学习之Observer(观察者)模式
  • Java应用性能调优
  • learning koa2.x
  • MobX
  • Python十分钟制作属于你自己的个性logo
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue ES6 Jade Scss Webpack Gulp
  • 给第三方使用接口的 URL 签名实现
  • 基于遗传算法的优化问题求解
  • 区块链技术特点之去中心化特性
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​水经微图Web1.5.0版即将上线
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $L^p$ 调和函数恒为零
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)IO流之ByteArrayInput/OutputStream
  • (译) 函数式 JS #1:简介
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • *Django中的Ajax 纯js的书写样式1
  • .NET Core中的去虚
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net6+aspose.words导出word并转pdf
  • ??eclipse的安装配置问题!??
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Android] Amazon 的 android 音视频开发文档
  • [Android]通过PhoneLookup读取所有电话号码
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [AutoSAR系列] 1.3 AutoSar 架构