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.

刚开始的想法

想着复制数组与每一个对应元素作差,重复最多的数组得到的零最多,于是用减后的绝对值求和最小值来判断。
这个思路有几个问题:
第一,即使实现了,就算是对的,复杂的非常高
第二,作差后得到的零最多,不代表求和就最小
第三,这种方法只能找出相对来说多的,而没有切合到more than n/2这个题设,相当于自己扩大问题,必然复杂度变高
public class Solution {
    public int majorityElement(int[] nums) {
        int[] dup = new int[nums.length];
        int sum = 0;
        int min = 100000;
        int index = 0;
        for(int i = 0;i < nums.length;i++){
            for(int k = 0;k < nums.length;k++){
                dup[k] = nums[k];
            }
            for(int j = 0;j < nums.length;j++){
                dup[j] -= nums[i];
                sum += Math.abs(dup[j]);
            }
            System.out.println("sum:-->"+sum);
            if(sum <= min){
                min = sum;
                index = i;
            }
            sum = 0;//用于本轮计数的注意清零
        }
        return nums[index];
    }
}


正确的思路(转自http://www.cnblogs.com/fanyabo/p/4178993.html)

1.思路1:Moore voting algorithm--每找出两个不同的element,就成对删除即count--,最终剩下的一定就是所求的。时间复杂度:O(n)  从头到尾遍历,用一个cn=1记录,下一个数与上一个数一样的时候cn++,不一样就cn--,cn为0的时候换值
2.思路2:随机挑选一个元素,检查是否是多数元素。时间复杂度:Average:O(n)。期望查找次数 <2,因为目标过半
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值