LeetCode Majority Element

int majorityElement(int* nums, int numsSize) {
    int times=0;
    //Hashtime *hash[numsSize];
    int major;
    //hash = (int*)calloc(1,sizeof(int));
    for(int i=0;i<numsSize;i++)
    {
        if(times==0||major==nums[i]){
                major=nums[i];
                ++times;
            }else 
                --times;
    }
    return major;
}
上面代码是一种取巧方法,利用主元素出现次数一定大于一半这种规律
也有人利用排序算法,将排好序的数组取中间值一定是主元素,当然时间复杂度还是上面的方法好。
我本来想利用hash表记录,但是由于空间复杂度没有上面的好,该决定用上面的方法。
这里粘贴一个别人的hash表的方法。
<pre class="objc" name="code">#define MIN_VALUE 0x80000000

typedef struct _Node {
    int val;
    int count;
} Node;

int majorityElement(int* nums, int numsSize) {
    const int length = numsSize * 2;
    Node hashtable[length];
    int result = 0;

    for(int i = 0; i < length; ++i) {
        hashtable[i].val = MIN_VALUE;
        hashtable[i].count = 0;
    }

    for(int i = 0; i < numsSize; ++i) {
        int position = *(nums + i) % length;
        position += (position >= 0 ? 0 : length);
        while(hashtable[position].val != MIN_VALUE) {
            if(hashtable[position].val == *(nums + i)) {
                hashtable[position].count++;
                break;
            } else {
                position = (position + 13) % length;
            }
        }
        if(hashtable[position].val == MIN_VALUE) {
            hashtable[position].val = *(nums + i);
            hashtable[position].count = 1;
        }
    }
    for(int i = 0; i < length; ++i) {
        if(hashtable[i].count > numsSize >> 1) {
            result = hashtable[i].val;
        }
    }
    return result;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值