LintCode 中位数/第K大元素

来源:互联网 发布:未来卓越it 编辑:程序博客网 时间:2024/04/30 01:57

给定一个未排序的整数数组,找到其中位数。

中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

给出数组[4, 5, 1, 2, 3], 返回 3

给出数组[7, 9, 4, 5],返回 5

Challenge
时间复杂度为O(n)

若利用快排排序之后再查找,时间复杂度为O(nlgn)。快排每次处理划分之后的两侧,在这里查找中位数只需要处理一侧,时间复杂度为O(n)。

public class Solution {    /*     * @param nums: A list of integers     * @return: An integer denotes the middle number of the array     */    public int median(int[] nums) {        // write your code here        int n=nums.length;        if (n%2==0){            return getKNum(nums,0,n-1,n/2-1);         }        else{            return getKNum(nums,0,n-1,n/2);        }    }    public int getKNum(int[] nums,int l,int right,int k){        int i=l-1;        int j=l;        while(j<right){            if (nums[j]<nums[right]){                i++;                int temp=nums[j];                nums[j]=nums[i];                nums[i]=temp;            }            j++;        }        i++;        int temp=nums[right];        nums[right]=nums[i];        nums[i]=temp;        if(k==i){            return nums[i];        }        else if(k<i){            return getKNum(nums,l,i-1,k);        }        else{            return getKNum(nums,i+1,right,k);        }    }}

方法getKNum(int[] nums,int l,int right,int k)查找的是数组nums中的第K个数。