剑指offer题解(数组中出现次数超过一半的数字)

题目描述


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

解题思路

 

先找到出现次数最多的一个数字(一个数组去掉两个大小不同的数字,出现次数最多的数字依然还是出现次数最多的数字,所以用两个指针i,j分别从从数组的两端向中间收缩,如果两个元素不相等,移动两个指针,否则移动一个指针,最后的那个元素就是出现次数最多的元素)。然后遍历整个数组看这个数字出现次数有没有超过数组元素个数的一半,如果有就返回这个数字,否则返回0。

代码

 

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int len=numbers.size();
        int i=0,j=len-1;
        while(i<j)
        {
            if(numbers[i]!=numbers[j])
            {
                i++;
                j--;
            }
            else
                i++;
        }
        int count=0;
        for(int k=0;k<len;k++)
        {
            if(numbers[k]==numbers[i])
                count++;
        }
        if(count>len/2)
            return numbers[i];
        return 0;
    
    }
};


 

猜你喜欢

转载自blog.csdn.net/sinat_40766770/article/details/84918348