美文网首页Leetcode
Leetcode.169.Majority Element

Leetcode.169.Majority Element

作者: Jimmy木 | 来源:发表于2019-11-13 10:15 被阅读0次

    题目

    给定一个非空长度为n的数组, 数组中有一个数超过n/2, 输出该数.

    Input: [3,2,3]
    Output: 3
    
    Input: [2,2,1,1,1,2,2]
    Output: 2
    

    思路1

    通过map记录每个数出现的次数.
    容易实现, 时间复杂度一般, 空间复杂度太高.

    int majorityElement(vector<int>& nums) {
        if (nums.empty()) return 0;
    
        unordered_map<int, int> map;
        int max = 0;
        int res = nums[0];
        for(int a : nums) {
            if (map.count(a) == 0) {
                map[a] = 1 ;
            } else {
                map[a] += 1;
            }
            if (map[a] > max) {
                max = map[a];
                res = a;
            }
        }
        return res;
    }
    

    思路2

    排序, 超过一般的数肯定在排序数组的中间位置.

    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
    

    思路3

    双指针, 一个前指针, 一个后指针.
    如果两个指针的数不一样, 就将两个数都置为INT_MIN. 最后剩下不为INT_MIN的即为出现超过一半的数.

    int majorityElement(vector<int>& nums) {
        if (nums.empty()) return 0;
        for(int i = 0, j = 1; j < nums.size();) {
            while (nums[i] == INT_MIN) {
                i++;
            }
            if (nums[i] != nums[j]) {
                nums[i++] = INT_MIN;
                nums[j++] = INT_MIN;
            }else {
                j++;
            }
        }
        for(int a : nums) {
            if (a != INT_MIN) {
                return a;
            }
        }
        return nums[0];
    }
    

    总结

    出现超过一半的数比较特殊, 利用双指针, 将不一样的元素忽略掉, 最后剩下的即为结果.

    相关文章

      网友评论

        本文标题:Leetcode.169.Majority Element

        本文链接:https://www.haomeiwen.com/subject/vcqhictx.html