【劍指offer】39、數組中出現次數超過一半的數字
阿新 • • 發佈:2018-07-20
當前 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、數組中出現次數超過一半的數字