[leetcode]Majority Element

超过了一半是这个数,所以排个顺,第n/2个也就是中间那个就是我们要的。。。

但是我们也没必要全部排序,只要找到第n/2个就好了。。。

 

class Solution {
public:
    int find_kth(vector<int>& num, int left, int right, int k) {
        if (left == right) {
            return num[k];
        }
        int l = left;
        int r = right;
        swap(num[l], num[(l+r)/2]);
        int mid = num[l];
        while(l < r) {
            while(l < r && num[r] >= mid) r--;
            if (r > l) num[l++] = num[r];
            while(l < r && num[l] < mid) l++;
            if (r > l) num[r--] = num[l];
        }
        num[l] = mid;
        if (l >= k) return find_kth(num, left, l, k);
        else return find_kth(num, l + 1, right, k);
    }
    int majorityElement(vector<int> &num) {
        return find_kth(num, 0, num.size() - 1, num.size() / 2);
    }
};

 换个写法

class Solution {
public:
    int majorityElement(vector<int> &num) {
        int cnt = 1;
        int b = num[0];
        for (int i = 1; i < num.size(); i++) {
            if (b == num[i]) {
                cnt++;
            } else {
                cnt--;
                if (cnt == 0) {
                    b = num[i];
                    cnt++;
                }
            }
        }
        return b;
    }
};

 

你可能感兴趣的:(LeetCode)