前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode-46.主元素

LintCode-46.主元素

作者头像
悠扬前奏
发布2019-05-31 16:07:55
3640
发布2019-05-31 16:07:55
举报

题目

描述

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

样例

给出数组[1,1,1,1,2,2,2],返回 1

解答

思路

看到这个题目,第一反应是排序后取中间数,这没什么好说的。 这个题目的挑战是时间复杂度为O(n),空间复杂度是O(1)。这个有点意思。 如果一个数组存在主元素,那么在数组中删除两个不同的数,对于主元素的地位是没有影响的。根据这个思路设计算法。

代码

代码语言:javascript
复制
public class Solution {
    /**
     * @param nums: a list of integers
     * @return: find a  majority number
     */
    public int majorityNumber(ArrayList<Integer> nums) {
        // write your code
        /**
        * count: 统计当前认为的主元素的数量
        * seed: 当前认为的主元素
        * n: 数组长度
        **/
        int count = 0, seed = nums.get(0), n = nums.size();
        //从两头往中间循环
        for(int i = 1; i<n/2; i++){
            //若两数相等,主元素备选
            if(nums.get(i) == nums.get(n-i)){
                //若当前没有认为的主元素
                if(count == 0){
                    //那么取当前数为主元素
                    seed = nums.get(i);
                    //统计加一
                    count++;
                }
                //若已有认为的主元素
                else{
                    // 若与主元素相等,统计量加一
                    if(seed == nums.get(i)) count++;
                    // 若与主元素不等,统计量减一
                    // 这里如果减小到0了,可能会产生主元素切换
                    else count--;
                }
            }
        }
        //统计主元素出现的次数
        for(int i = 0;i<n;i++){
            if(nums.get(i) == seed){
                count++;
            }
        }
        //超过一半才被认为是主元素
        if(count >= n/2){
            return seed;
        }
        //提交了几次发现如果没超过一半需要返回最后的元素
        else{
            return nums.get(n-1);
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.07.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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