方法一:采用快排中的划分思想,找到这个数组中的中位数,即为答案。

时间复杂度: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 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiao-gan/p/9163380.html