1. 程式人生 > >【劍指offer】39、數組中出現次數超過一半的數字

【劍指offer】39、數組中出現次數超過一半的數字

當前 span pan 時間 超過 例如 思路 begin 是否

題目

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。

思路一

基於partition,挑一個數字,把數組分成兩部分,左邊都比它小,右邊都比它大。

因為有一個數字出現的次數超過長度的一半

因此當選中的數字的index = n/2,這個數字就是中位數

然後再檢查它次數是否超過一半即可,時間復雜度為O(n)

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int
> numbers) { if (numbers.size() == 0) return 0; int length = numbers.size(); int mid = length >> 1, start = 0, end = length - 1; int index = Partition(numbers, start, end); while (index != mid){ if (index > mid){ end
= index - 1; index = Partition(numbers, start, end); } else{ start = index + 1; index = Partition(numbers, start, end); } } if (!CheckMoreThanHalf(numbers, numbers[index])) return 0;
return numbers[index]; } int Partition(vector<int>& input, int begin, int end) { int low = begin, high = end; int pivot = input[low]; while(low < high) { while( low < high && pivot<=input[high]) high--; input[low] = input[high]; while(low < high && pivot >= input[low]) low++; input[high] = input[low]; } input[low] = pivot; return low; } bool CheckMoreThanHalf(vector<int> numbers, int temp){ int times = 0; int len = numbers.size(); for (int i = 0; i < len; i++){ if (numbers[i] == temp) times++; } if (2 * times > len ) return true; else return false; } };

思路二

在遍歷數組時,當遍歷下一個數字和當前保存數字相同,則加1,不同則減1。

若次數為0的話,則需要保存下一個數字,同時次數設為1

要找的數字肯定是最後一個把次數設為1時對應的數字。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers){
        if (!numbers.size())
            return 0;
        int length = numbers.size();
        int result = 0, count = 1, temp = numbers[0];
         
        for (int i = 1; i < length; i++){
            if (numbers[i] == temp)
                count++;
            else
                count--;
            if (count == 0){
                count = 1;
                temp = numbers[i];
            }
        }
        if (CheckMoreThanHalf(numbers, temp))
            return temp;
        else
            return 0;
    }
         
    bool CheckMoreThanHalf(vector<int> numbers, int temp){
        int times = 0;
        int len = numbers.size();
        for (int i = 0; i < len; i++){
            if (numbers[i] == temp)
                times++;
            if (2 * times > len)
                return true;
            else
                return false;
        }
    }
};

【劍指offer】39、數組中出現次數超過一半的數字