码迷,mamicode.com
首页 > 编程语言 > 详细

剑指Offer - 判断数组中是否有一个数出现次数多于一半

时间:2018-02-11 01:15:57      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:ranking   有一个   www.   解法   question   for   cti   次数   题目   

https://www.nowcoder.net/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 
 

思路:

勉强做出来了,但是最后一步还是参考了别人的。就是关于怎么检验这个数字出现的次数的确是超过了一半,而不是没有解的结果,我没有什么思路。看了别人的。
别人有好几种解法,我觉得partition的思路还是很不错的。
那么我自己,其实用的是消去法。能解出结果,不过最后是需要再O(n)检查一下这个结果的确合法。
 

我的代码如下:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> xx) {
        vector<int> numbers = xx;
        int n = numbers.size();
        while (n > 1) {
            int y = 0;
            for (int x = 0; x < n/2; ++x) {
                if (numbers[2*x] == numbers[2*x+1]) {
                    numbers[y++] = numbers[2*x];
                }
            }
            if (n == n/2*2+1) {
                numbers[y++] = numbers[n-1];
            }
            n = y;
        }
        int cnt = 0;
        for (int i=0; i<xx.size(); ++i) {
            if (xx[i] == numbers[0]) cnt++;
        }
        
        if (cnt > xx.size() / 2) return numbers[0];
        else return 0;
        
    }
};

 

 
 
 
 

剑指Offer - 判断数组中是否有一个数出现次数多于一半

标签:ranking   有一个   www.   解法   question   for   cti   次数   题目   

原文地址:https://www.cnblogs.com/charlesblc/p/8440184.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!