数组中出现次数超过一半的数字

博客围绕一个题目展开,尝试一的程序通过了所有测试用例。解题思路是先用快速排序对数据排序,再求中点向两侧与中点值相同的数字个数,判断其是否大于数据长度的一半,最终得出使用快速排序的结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


题目内容

尝试一

结果:答案正确:恭喜!您提交的程序通过了所有的测试用例
代码:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        //特殊处理
        if(array==null || array.length<=0){
            return 0;
        }
        //快速排序
        fastSort( 0, array.length-1,array);

        /*求中点向两侧与中点值相同的数字的个数是否大于length/2*/
        int count=1;
        int i=array.length/2;
        int right=i+1;
        int left=i-1;
        while( right<array.length && array[right]==array[i]){
            ++count;
            right++;
        }

        while(left>-1 && array[left]==array[i]){
            ++count;
            left--;
        }
        
        if(count>array.length/2){
            return array[i];
        }
        return 0;
        
    }


    /*快速排序*/
    private void fastSort(int i,int j,int a[]){
        /*递归结束标识*/
        if(i >= j ){
            return ;
        }

        /* 从右边找寻比a[i]小的值(最小),交换*/
        int minIndex=i;
        for(int k=j;k>i;--k){
            if(a[k]<a[minIndex]){
                minIndex=k;
            }
        }
        if(i!=minIndex){
            int temp=a[i];
            a[i]=a[minIndex];
            a[minIndex]=temp;
        }

        /* 从左边找寻比a[j]大的值,交换*/
        int maxIndex=j;
        for(int k=i+1;k<j;++k){
            if(a[k]>a[maxIndex]){
                maxIndex=k;
            }
        }
        if(j!=maxIndex){
            int temp=a[j];
            a[j]=a[maxIndex];
            a[maxIndex]=temp;
        }

        //递归
        fastSort(i+1,j-1,a);
    }

}

思路:

  1. 先排序(我用的是快速排序)
  2. 求中点向两侧与中点值相同的数字的个数是否大于length/2

结论

  1. 快速排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值