数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
如果不存在则输出0。
思路一: 先排序,排好序之后所有相同的数都在一起了,统计相同的数的个数,并判断个数是吧超过一半
时间复杂度O(nlogn)不是最好的
代码:
class Solution { public: // 先排序,再用计数器统计相同的元素 int MoreThanHalfNum_Solution(vector<int> numbers) { int len = numbers.size(); if (len <= 0) return 0; else if (len == 1) return numbers[0]; // 时间复杂度是o(nlogn)并不是最优的 sort(numbers.begin(), numbers.end()); int count = 1; for(int i = 0; i < len-1; i++) { if (numbers[i] == numbers[i+1]) { count++; } else count = 1; if (count > len/2) return numbers[i]; } return 0; } }
由于是超过数组的一半,那么排好序的数组中的len/2就是所得结果
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { int len = numbers.size(); if (len <= 0) return 0; if (len <= 1) return numbers[0]; std::sort(numbers.begin(), numbers.end()); cout << numbers[len/2]; // 排好序之后统计 return numbers[len/2]; } };
思路二: 时间复杂度是O(n)
如果有符合条件的数字,那么它出现的次数要比其他数字出现的和还要多
所以遍历数组时保存两个值,一个是key为数组中的数字,另一个是times出现的次数
当我们遍历数组时如果下一个数字和之前保存的key值相同则次数加一,
不同时次数减一,当次数为0时,保存当前数字的值,count为1
遍历结束后,保存的数字就是所求的
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 class Solution { 7 public: 8 9 // 思路二: 时间复杂度是O(n) 10 // 如果有符合条件的数字,那么它出现的次数要比其他数字出现的和还要多 11 // 所以遍历数组时保存两个值,一个是key为数组中的数字,另一个是times出现的次数 12 // 当我们遍历数组时如果下一个数字和之前保存的key值相同则次数加一, 13 // 不同时次数减一,当次数为0时,保存当前数字的值,count为1 14 // 遍历结束后,保存的数字就是所求的 15 16 int MoreThanHalfNum_Solution(vector<int> numbers) { 17 int len = numbers.size(); 18 if (len <= 0) 19 return 0; 20 int key = numbers[0]; 21 int times = 1; 22 for(int i = 1; i < len; ++i) 23 { 24 if (key == numbers[i]) 25 ++times; 26 else 27 --times; 28 if (times == 0) 29 { 30 key = numbers[i]; 31 times = 1; 32 } 33 } 34 int count = 0; // 统计key出现的次数 35 for (int i = 0; i < len; i++) 36 { 37 if(key == numbers[i]) 38 count++; 39 } 40 if (count > len/2) 41 return key; 42 else 43 return 0; 44 } 45 }; 46 int main() 47 { 48 Solution s; 49 vector<int> vec ={1,2,3,2,2}; 50 int t = s.MoreThanHalfNum_Solution(vec); 51 cout << t; 52 return 0; 53 }