2021-09-09(剑指 Offer 39. 数组中出现次数超过一半的数字)

方法一:是利用的是“得到数组中第k大的数字”算法。即快排的partition方法或者大根堆方法。
快排的partition方法
大根堆方法

class Solution {
    Random random=new Random();
    public int majorityElement(int[] nums) {
        return quickSelect(nums,0,nums.length-1,nums.length/2);
    }
    public int quickSelect(int[] a,int left,int right,int index){
        int ran=random.nextInt(right-left+1)+left;
        swap(a,ran,left);
        int i=left;
        int j=right;
        int temp=a[left];
        while(i<j){
            while(temp<=a[j]&&i<j){
                --j;
            }
            while(a[i]<=temp&&i<j){
                ++i;
            }
            if(i<j){
                swap(a,j,i);
            }
        }
        swap(a,left,i);
        if(i==index){
            return a[i];
        }else{
            return i<index?quickSelect(a,i+1,right,index):quickSelect(a,left,i-1,index);
        }
    }
    public void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

方法2:根据特点来计算

class Solution {
    Random random=new Random();
    public int majorityElement(int[] nums) {
        int time=0;
        int result=0;
        for(int i=0;i<nums.length;++i){
            if(time==0){
                result=nums[i];
                time=1;
            }else if(nums[i]==result){
                ++time;
            }else{
                --time;
            }
        }
        return result;
    }
}

上一篇:LCP 39. 无人机方阵


下一篇:测试平台系列(39) 接入github第三方登录(下)