劍指Offer-28.數組中出現次數超過一半的數字(C++/Java)

題目:

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。若是不存在則輸出0。java

分析:

能夠先假設數組中有超過數組長度一半的元素,找到這個元素,而後再驗證。數組

對數組進行排序,若是有一個數字出現的次數超過數組長度的一半,那麼這個元素必定是數組長度/2索引位置的那個元素,再遍歷數組,統計出現的次數是否大於一半便可。spa

還能夠利用投票法,當下一個元素與上一個元素相同時,計數+1,不一樣時計數-1,計數爲0時從新記錄數字,若是存在超過一半的元素,那麼就必定是最後所記錄的元素,一樣的遍歷數組驗證一下就能夠了。code

程序:

C++blog

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int count = 0;
        int res = 0;
        for(int num:numbers){
            if(count == 0)
                res = num;
            if(num == res)
                count++;
            else
                count--;
        }
        count = 0;
        for(int num:numbers){
            if(num == res)
                count++;
        }
        return count > numbers.size()/2 ? res : 0;
    }
};
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(), numbers.end());
        int count = 0;
        int mid = numbers.size() / 2;
        for(int nums:numbers){
            if(nums == numbers[mid])
                count++;
        }
        return count > mid ? numbers[mid] : 0;
    }
};

Java排序

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int count = 0;
        int mid = array.length / 2;
        Arrays.sort(array);
        for(int num:array){
            if(num == array[mid])
                count++;
        }
        return count > mid ? array[mid] : 0;
    }
}
相關文章
相關標籤/搜索