1 題目描述 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個 ...
1 題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。2 思路和方法
(1) 哈希表
用哈希表記錄每個元素出現的次數,如果該元素出現次數超過一半,返回1,時間複雜度O(n),空間複雜度O(n)。m[numbers[i]]+=1;
map<int, int> m;
(2) 排序
先排序,取中間的數,若這個數在數組中出現超過長度一半,則存在;否則不存在時間複雜度O(nlogn)排序;空間複雜度O(1).
(3) 查找中位數 O(n)
基於partiton函數 O(n),如果存在:該數出現次數超過一半,排序第2/n個元素是該元素;即為中位數
3 C++核心代碼
(1)哈希表 m[numbers[i]]+=1;
map<int, int> m;
1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) { 4 // 哈希表存儲某個數出現的次數 hash查詢時間複雜度O(1);總時間複雜度O(n) 5 map<int, int> m; 6 for (int i = 0; i < numbers.size(); ++i) { 7 m[numbers[i]]+=1; 8 if(m[numbers[i]]>numbers.size()/2) 9 return numbers[i]; 10 } 11 return 0; 12 } 13 };View Code
(2) 排序
1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) { 4 sort(numbers.begin(),numbers.end()); 5 int key = numbers[numbers.size()/2]; 6 int count = 0; 7 for (int i = 0; i < numbers.size(); ++i) { 8 if(key == numbers[i]) 9 ++ count; 10 } 11 if (count>numbers.size()/2) 12 return key; 13 return 0; 14 } 15 };View Code
(3) 查找中位數 O(n)——完整代碼
1 #include <iostream> 2 int Partition(int A[], int low, int high) 3 { 4 int pivot = A[low]; 5 while (low <high) 6 { 7 while (low<high && A[high] >= pivot) --high; 8 A[low] = A[high]; 9 while (low<high && A[low] <= pivot) ++low; 10 A[high] = A[low]; 11 } 12 A[low] = pivot; 13 return low; 14 } 15 int HalfData(int a[], int len) 16 { 17 int start = 0; 18 int end = len - 1; 19 int middle = len >> 1; 20 int index = Partition(a, start, end); 21 22 while (index != middle) 23 { 24 if (index > middle) 25 { 26 end = index - 1; 27 index = Partition(a, start, end); 28 } 29 else 30 { 31 start = index + 1; 32 index = Partition(a, start, end); 33 } 34 } 35 return a[index]; 36 } 37 int main() 38 { 39 int a[9] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 }; 40 int len = 9; 41 int result = HalfData(a, 9); 42 printf("result:%d\n", result); 43 44 system("pause"); 45 return 0; 46 }View Code
4 C++完整代碼
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int MoreThanHalfNum(vector<int> numbers) 7 { 8 if (numbers.size() == 0) 9 { 10 return 0; 11 } 12 13 int target = numbers[0]; 14 unsigned int cnt = 1; 15 16 for (unsigned int i = 1; i < numbers.size(); ++i) 17 { 18 if (target == numbers[i]) 19 { 20 cnt++; 21 } 22 else 23 { 24 cnt--; 25 } 26 27 if (cnt == 0) 28 { 29 cnt = 1; 30 target = numbers[i]; 31 } 32 } 33 cnt = 0; 34 for (unsigned int i = 0; i < numbers.size(); ++i) 35 { 36 if (target == numbers[i]) 37 { 38 cnt++; 39 } 40 } 41 42 if (cnt * 2 > numbers.size()) 43 { 44 return target; 45 } 46 47 return 0; 48 } 49 50 int main(void) 51 { 52 int a[] = {1,2,2,2,3,4,2,5,2}; 53 vector<int> v(a, a + 9); 54 55 cout<<MoreThanHalfNum(v)<<endl; 56 57 return 0; 58 }View Code
https://blog.csdn.net/u013575812/article/details/50130307
時間複雜度O(n)。初始認為數組第一個數就是目標數(target)。之後遍曆數組後面的元素,如果等於目標數,計數++; 否則計數--;如果發現目標數的計數<=0 說明當前目標數並不是最終的輸出結果。更新目標數為當前遍歷到的元素。遍歷完數組所有元素之後 驗證一下結果即可。
參考資料
https://blog.csdn.net/zjwreal/article/details/88607992
https://blog.csdn.net/u013575812/article/details/50130307