【测评中的编程题】找到数组中出现次数最多(超过数组大小的一半)的数
方法一:采用快排中的划分思想,找到这个数组中的中位数,即为答案。
时间复杂度:O(n)
空间复杂度:O(n) 因为要改变原数组的排列顺序
方法二:采用数数对消的思想,最后留下的数即为答案。
时间复杂度:O(n)
空间复杂度:O(1)
1 vector<int> findNum(const vector<int> &nums) 2 { 3 int val, t, i; 4 vector<int> result; 5 6 if (nums.size() == 0) 7 return result; 8 for (t = 0, i = 0; i != nums.size(); ++i) { 9 if (t == 0) { 10 val = nums[i]; 11 ++t; 12 continue; 13 } 14 if (nums[i] == val) 15 ++t; 16 else 17 --t; 18 } 19 20 t = 0; 21 for (i = 0; i != nums.size(); ++i) 22 if (nums[i] == val) 23 ++t; 24 if (t > (nums.size() >> 1)) 25 result.push_back(val); 26 27 return result; 28 }
后记:一般找数组中出现次数最多的数是利用map表
版权声明:本文为xiao-gan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。