LeetCode------Kth Largest Element in an Array

这里写图片描述

快排partition

这道题最好的解法应该是用快速排序Quick Sort的思想,这里排序的方向是从大往小排,核心思想是每次都要先找一个中枢点Pivot,然后遍历其他所有的数字,这里要求第k大,就把大于中枢点的数字放到左半边,把小于中枢点的放在右半边,这样中枢点是整个数组中第几大的数字就确定了,虽然左右两部分不一定是完全有序的,但是并不影响本题要求的结果,所以我们求出中枢点的位置,如果正好是k-1,那么直接返回该位置上的数字;如果大于k-1,说明要求的数字在左半部分,更新右边界,再求新的中枢点位置;反之则更新右半部分,求中枢点的位置;实例代码如下:

package com.zhumq.lianxi;
import org.junit.Test;

public class FindKthLargest {
    public int findKthLargest(int arr[],int k) {
        int left = 0,right = arr.length-1;
        while(true) {
            //位置调整
            int pos = partition(arr,left,right);
            if(pos==k-1) return arr[pos];
            else if(pos>k-1) right = pos-1;
            else left = pos+1;
        }
    }

    private int partition(int[] arr, int left, int right) {
        int pivot = arr[left],l = left + 1,r = right;
        while(l<=r) {
            //从大到小排序,小于中枢的放在右边,大于中枢的放在左边
            if(arr[l]<pivot&&arr[r]>pivot) {
                int temp = arr[l];
                arr[l] = arr[r];
                arr[r] = temp;
                ++l;
                --r;
            }
            if(arr[l]>=pivot) ++l;
            if(arr[r]<=pivot) --r;
        }
        int temp = arr[left];
        arr[left] = arr[r];
        arr[r] = temp;
        return r;
    }
    @Test
    public void test1() {
        int arr[] = {1,5,2,3,4,7,6,9,0};
        System.out.println(findKthLargest(arr, 4));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值