面试题29 数组中出现次数超过一半的数字

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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         if (numbers.size() == 0)
 5             return 0;
 6         int result = numbers[0];
 7         int times = 1, count = 0;
 8         for (int i = 1; i < numbers.size(); i++){
 9             if (times == 0){
10                 result = numbers[i];
11                 times = 1;
12             }
13             else if (numbers[i] == result)
14                 times++;
15             else
16                 times--;
17         }
18         for (int i = 1; i < numbers.size(); i++){
19             if (numbers[i] == result){
20                 count++;
21             }
22         }
23         if (count >= numbers.size() / 2)
24             return result;
25         else
26             return 0;
27
28     }
29 };
时间: 2024-10-27 06:15:14

面试题29 数组中出现次数超过一半的数字的相关文章

剑指offer 面试29—数组中出现次数超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 解法一: 先将数组排序,然后出现次数超过一半的数字就是a[n/2+1],时间复杂度O(nlgn). 解法二:O(n) 基本思想: 消除原理:在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数.当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1.如果下一个数字

面试题29_数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 解题思路 出现超过一半的数,一定是排好序的数组的中位数,即位置为 n/2 的数. 找到这个中位数,然后,遍历一次,判断是否出现次数超过一半,若是,则返回true,否则,没有这样的数. 关键在于如何得到这个中位数? 两种思路, 1.对数组进行排序,直接取中位数,时间复杂度O(nlogn): 2.利用

29 - 数组中出现次数超过一半的数字

题目描述:http://ac.jobdu.com/problem.php?pid=1370 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 直观想法是,先排序O(nlgn),那么下标是 n/2 的位置上一定是超过数组长度一半的数字. 另一种思路是: 用快排里面的划分函数,随机选一个元素,将比它小的交换到左侧,比它大的交换到右侧,最后交它交换到左右的中间.

面试题五 数组中出现次数超过一半的数字 时间为O(n)

也就是说 该数字出现的次数比其他所有数字出现次数的和还要多. 因此可以保存两个值,一个数字,一个次数. 遍历时 1.如果数字相同,count++ 2.如果count == 0 count = 1 number替换 3.如果不相同 count-- int main(){ int array[] = {3, 2, 3, 1, 3, 4}; int number = array[0], count = 0; for (int i = 1; i < 6; i++){ if (count == 0){ c

29数组中出现次数超过一半的数字

过程: int MoreThanHalfNum(int* numbers, int length) { if (CheckInvalidArray(numbers, length)) return 0; int middle = length >> 1; int start = 0; int end = length - 1; int index = Partition(numbers, length, start, end); while (index != middle) { if (in

面试题:数组中出现次数超过一半的数字

题目描述: 方法1:哈希表 import java.util.HashMap; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { HashMap<Integer,Integer> map = new HashMap<>(); for(int i=0;i<array.length;i++){ Integer key=array[i]; Integer value=map.get

剑指OFFER----面试题39. 数组中出现次数超过一半的数字

链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/ 思路: cnt记录个数,val记录值:遍历数组,若等于val,则cnt++,否则cnt--,若cnt为0,则重置,最后val即为结果. 代码: class Solution { public: int majorityElement(vector<int>& nums) { int cnt =

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt