题解 | #最长无重复子数组#

寻找第K大

http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

快排 + 二分(每次只取k所在范围进行快排)

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        return find(a , 0 , n - 1, K);
    }
//分治。每次只取包含k的范围进行快排定位
    public int find(int[] a, int low, int high, int K){
        int pivot = partition(a, low, high);
        if(pivot + 1 < K){
            return find(a, pivot + 1, high, K);
        }else if(pivot + 1 > K){
            return find(a, low, pivot - 1, K);
        }else{
            return a[pivot];
        }
    }
// 快排定位。从最右开始和基准进行比较,直到遇到比基准小的,和左侧的left进行交换。
// 从左侧的位置开始向右比较,直到遇到比基准大的,和右侧的right进行交换。
// 最后输出基准数字所在位置。
    public int partition(int[] a, int low, int high){
        int pivotValue = a[low];
        while(low < high){
            while(low < high && a[high] <= pivotValue){
                high--;
            }
            a[low] = a[high];
            while(low < high && a[low] >= pivotValue){
                low++;
            }
            a[high] = a[low];
        }
        a[low] = pivotValue;
        return low;
    }
}
全部评论

相关推荐

2024-11-27 16:15
合肥工业大学 Java
点赞 评论 收藏
分享
安全劝退第二人:给我发个
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务