leetcode ----查找数组中超过一般的数字

以下内容均为本人学习笔记,若有错误,欢迎指出

链接:题目链接
来源:牛客网

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

分析


如果这个数字出现此处超过数组长度一半,那么若数组有序,这个数字一定是中位数,所以我们可以采用找数组中的中位数,还记得快速排序算法中的partion吗?这是一个O(N)查找数组中第size/2 大的数字。若找到第size/2 大的数字,且下标为size/2,则找到了。

class Solution {
public:
        bool IStrue(vector<int> numbers,int length,int value)
        {

            int i = 0;
            int count = 0;
            for(i = 0;i < length;++i)
            {
                if(value == numbers[i])
                {
                    count++;
                }
            }
            if(count > length/2)
                return true;
            return false;
        }

        int partion(vector<int> numbers,int left,int right)
        {
            if(right - left <=1)
            {
                return left;
            }
            int tmp = numbers[right -1];
            int start = left;
            int end = right-1;
            while(start < end )
            {
                while(start < end && numbers[start]<= tmp)
                {
                        start++;
                }
                while(start < end && numbers[end]>= tmp)
                {
                        end--;
                }
                if(start < end)
                {
                    int cur = numbers[start];
                    numbers[start] = numbers[end];
                    numbers[end] = cur;
                }
            }
             int cur = numbers[start];
             numbers[start] = numbers[right - 1];
             numbers[right - 1] = cur;
            //swap(numbers[start], numbers[rigth -1]);
            return left;
        }

    int MoreThanHalfNum_Solution(vector<int> numbers) 
    {
        int length = numbers.size();
        if(length == 0)
        {
            return 0;
        }
        int left = 0;
        int right = length;
        int index = 0;
        int ret = 0;
        while(left < right)
        {
            index= partion(numbers,left,right);
            if(index == length/2)
            {
                ret = numbers[index];
                break;
            }
            if(index < length/2)
            {
                left = index + 1;
            }
            else
            {
                right = index -1;
            }
        }

        if(!IStrue(numbers,length,numbers[index]))
        {
            ret = 0;
        }
        return ret;
    }
};

猜你喜欢

转载自blog.csdn.net/misszhoudandan/article/details/81047908
今日推荐