寻找给定的一个数组中第k大的一个数,或者是寻找前k大个数

这道题是一道常见的面试题,其实这道题可以用快速排序的思想来实现,而且求前k大个数和第k大的数,其实思路是一样的,都是用快排的思想。只要不停遍历,直到找到分界点,即该分界点的右边的数都比该分界点大;该分界点左边的数都比该分界点小。而且刚好该分界点即为第k大的数。

    public static void Kth(int[] nums,int k)
    {
        int result = Kthtemp(nums,0,nums.length - 1,k);
        //for(int i = result; i < nums.length; i++)
        //    System.out.print(nums[i] + " ");
        //System.out.println();
        //System.out.println(nums[result]);
    }
    public static int Kthtemp(int[] nums,int low,int high,int k)
    {
        int middle = getMiddle(nums, low, high); 
        if (high - middle + 1 > k)
            return Kthtemp(nums, middle + 1, high, k);
        else if (high - middle + 1 < k)  //递归实现,调用该函数自身,调整的是个数
            return Kthtemp(nums, 0, middle - 1, k - (high - middle + 1));
        else   //当该分界点为k,那么直接返回该下标
            return middle;
    }
    public static int getMiddle(int[] array,int low,int high)
    {                                 //快排的思路,每次寻找分界点
        int tmp = array[low];
        while(low < high)
        {
            while(low < high && array[high] > tmp)
                high--;
            array[low] = array[high];
            while(low < high && array[low] < tmp)
                low++;
            array[high] = array[low];
        }
        array[low] = tmp;
        //System.out.print(array[low] + " ");
        return low;
    }

这道题是快排的变化题,需要不断温故。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值