leetcode169. Majority Element

来源:互联网 发布:加盟淘宝店需要多少钱 编辑:程序博客网 时间:2024/05/22 06:56

题目leetcode169. Majority Element
难度等级:easy

思路

由于majority member 出现次数大于总数一半,实际上就是求数组的中位数。最简单的思路,就是先排序,然后二分查找到中位数。但其实,可以直接利用快排算法的partition函数,就可以把中位数找出来。具体的做法就是,分块,但分块的中间元素index 等于 中位数的index时,结束。这样,时间复杂度虽然和快排一样,但是复杂度的系数会比快排小很多。

实现

class Solution {public:    int partition(vector<int>& nums, int l, int r) {        if(l > r) return -1;        else {            int key = nums[r], next = l;            for(int i = l; i < r; i++) {                if (nums[i] < key) {                    //swap nums[i] and nums[next]                    int tmp = nums[next];                    nums[next++] = nums[i];                    nums[i] = tmp;                }            }            //swap nums[r] and nums[next]            int tmp = nums[next];            nums[next] = nums[r];            nums[r] = tmp;            return next;        }    }    int majorityElement(vector<int>& nums) {        vector<int> c_nums(nums);        int size = c_nums.size();        int target = size / 2;        int l = 0, r = size - 1;        for(;;) {            int mid = this->partition(c_nums, l, r);            if(mid == target) break;            else if (mid < target)                l = mid + 1;            else                 r = mid - 1;        }        return c_nums[target];    }};
原创粉丝点击