LeetCode: Majority Element II

来源:互联网 发布:淘宝神笔有什么作用 编辑:程序博客网 时间:2024/06/10 16:46

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

题目解析:根据题目描述,我们知道一个数组中最多两个满足要求的结果。

因此,这里可以用投票法,每个满足要求的数的个数都大于不满足要求的个数,转换为了一个众数的情况。

源代码:

/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */int* majorityElement(int* nums, int numsSize, int* returnSize) {    int res1 = 0;    int res2 = 0;    int cnt1 = 0;    int cnt2 = 0;        for (int i = 0; i < numsSize; ++i) {        if (nums[i] == res1) cnt1++;        else if (nums[i] == res2) cnt2++;        else if (cnt1 == 0) {            cnt1 = 1;            res1 = nums[i];        }        else if (cnt2 == 0) {            cnt2 = 1;            res2 = nums[i];        }        else {            cnt1--;            cnt2--;        }    }        // check    cnt1 = 0;    cnt2 = 0;    if (res1 == res2) res2 = res1 - 1;        for (int i = 0; i < numsSize; ++i) {        if (nums[i] == res1) cnt1++;        if (nums[i] == res2) cnt2++;    }            int* r;    if (cnt1 > numsSize/3 && cnt2 > numsSize / 3) {        *returnSize = 2;        r = (int*)malloc(2 * sizeof(int));        r[0] = res1;        r[1] = res2;    }    else if (cnt1 > numsSize / 3) {        *returnSize = 1;        r = (int*)malloc(1 * sizeof(int));        r[0] = res1;    }    else if (cnt2 > numsSize / 3) {        *returnSize = 1;        r = (int*)malloc(1 * sizeof(int));        r[0] = res2;    }    else {        *returnSize = 0;        r = NULL;    }    return r;}


1 0
原创粉丝点击