剑指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 len = numbers.size();
 5         if (len == 0)
 6             return 0;
 7         int num = 1, temp = numbers[0];
 8         for (int i = 1; i < len; i++) {
 9             if (numbers[i] != temp) {
10                 if (num == 0) {
11                     temp = numbers[i];
12                     num = 1;
13                 } else {
14                     num--;
15                 }
16             } else {
17                 num++;
18             }
19         }
20         int ans = 0;
21         for (int i = 0; i < len; i++) {
22             if (temp == numbers[i])
23                 ans++;
24         }
25         if (ans > (len >> 1))
26             return temp;
27         else
28             return 0;
29     }
30 };

思路二:

借鉴快排思想。

原文地址:https://www.cnblogs.com/qinduanyinghua/p/11386602.html