LintCode-46.主元素

题目

描述

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

样例

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

解答

思路

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

代码

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);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,775评论 0 33
  • 3.10 69.给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 二叉树的层次遍历样例给一棵二叉树 {3...
    mytac阅读 1,099评论 3 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,455评论 25 708
  • 不及花开,一谢就远。好多时候,孤独是忧伤的暗角,忧伤是明媚的必须,好多时候,那些青春里被温柔的岁月,总是一种疼痛...
    穆时子阅读 1,069评论 7 7
  • 人呀!能认识就是缘分,要相互珍惜,因为每个人的时间越來越少……不要争执,不要斗气,好好说话,相互理解!️世上最经典...
    春暖花开之歌阅读 699评论 0 0