【测评中的编程题】找到数组中出现次数最多(超过数组大小的一半)的数

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

时间复杂度: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表

posted @ 2018-06-10 15:25  AWC小干  阅读(166)  评论(0编辑  收藏  举报