zoukankan      html  css  js  c++  java
  • 找出数组中出现次数超过一半的数

    如果有一个数出现的次数超过一半,那他出现的次数肯定比其他数字出现次数的和还要多,这时可以遍历数组并保存两个值,一个是出现的数字,一个是次数,当下一个数字和保存的数字相同时,次数加1,如果不同,次数减1,如果次数为0,我们需要保存下一个数字,并将次数设为1。最后保存的数字即为所求。同时考虑空数组和没有出现次数超过一半的情况。

    class Solution {
    public:
        int MoreThanHalfNum_Solution(vector<int> numbers) {
        	if(numbers.empty())
                return 0;
            else{
                int res=numbers[0];
                int times=1;
                for(int i=1;i<numbers.size();++i){
                    if(times==0){
                        res=numbers[i];
                        times=0;
                    }
                    else if(numbers[i]==res)
                        times++;
                     else times--;
                }
                times =0;
                for(int i=0;i<numbers.size();++i){
                    if(numbers[i]==res)
                        times++;
                }
                if(times*2<=numbers.size())
                    return 0;
                return res;
            }
            
        }
    };


    基于Partition函数的O(n)算法

    类似快排,选定一个基准,比它小的都在左边,比它大的都在右边,比如如果它的下标小于n/2,那中位数应该位于右边,继续在右边查找。这样就可以找出超过一半的数。

    int Partition(int data[],int length,int start,int end){
        int index=RandomInRange(start,end);
        swap(data[index],data[end]);
        int small=start-1;
        for(index=start;index<end;++index){
            if(data[index]<data[end]){
                ++small;
                if(small!=index)
                    swap(data[index,data[small]);
            }
        }
        ++small;
        swap(data[small],data[end]);
        return small;
    }
    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(index>middle){
                end=index-1;
                index=Partition(numbers,length,start,end);
            }
            else{
                start=index+1;
                index=Partition(numbers,length,start,end);
            }
        }
        int result=numbers[middle];
        if(!CheckMoreThanHalf(numbers,length,result)
            result=0;
        return result;
    }

    CheckInvalidArray函数检查数组是否合法,CheckMoreThanHalf函数检查所得数字是否符合要求


  • 相关阅读:
    Gitlab 自动化部署 + 局域网访问 gitlab pages
    Gitlab 跨版本升级
    Gitlab 私有化管理 npm 包
    Postman-请求加密和设置 Cookie
    menuStrip鼠标滑过自动弹出
    JAVA实用案例之文件导入导出(POI方式)
    springboot npoi 合并单元格 之后设置单元格居中
    postman测试导出Excel接口
    Application.DoEvents()的作用
    设置WINFORM窗体及程序图标
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583348.html
Copyright © 2011-2022 走看看