28.数组中出现次数超过一半的数——剑指offer

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) {
 4         int n = numbers.size();
 5         if (n == 0) return 0;//长度为零直接返回
 6          
 7         int num = numbers[0], count = 1;//num为当前可能的结果,count计数
 8         for (int i = 1; i < n; i++) {
 9             if (numbers[i] == num) count++;//和当前值相等,加一
10             else count--;
11             if (count == 0) {//count为零,将当前值设为可能的结果
12                 num = numbers[i];
13                 count = 1;
14             }
15         }
16         // Verifying
17         count = 0;
18         for (int i = 0; i < n; i++) {
19             if (numbers[i] == num) count++;
20         }
21         if (count * 2 > n) return num;
22         return 0;
23     }
24 };

 

 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) {
 4         int n = numbers.size();
 5         //map 记录出现次数
 6         map<int, int> m;
 7         int count;
 8         for (int i = 0; i < n; i++) {
 9             count = ++m[numbers[i]];
10             if (count > n/2) return numbers[i];
11         }
12         return 0;
13     }
14 };

 

posted @ 2019-05-23 21:08  unique_ptr  阅读(149)  评论(0编辑  收藏  举报