Lintcode: Median

Given a unsorted array with integers, find the median of it. 



A median is the middle number of the array after it is sorted. 



If there are even numbers in the array, return the N/2-th number after sorted.



Example

Given [4, 5, 1, 2, 3], return 3



Given [7, 9, 4, 5], return 5



Challenge

O(n) time.

Quicksort的变形,quickselect,跟Kth largest Element很像

 1 public class Solution {

 2     /**

 3      * @param nums: A list of integers.

 4      * @return: An integer denotes the middle number of the array.

 5      */

 6     public int median(int[] nums) {

 7         // write your code here

 8         int len  = nums.length;

 9         if (len%2 == 0) return search(nums, len/2, 0, len-1);

10         else return search(nums, len/2+1, 0, len-1);

11     }

12     

13     public int search(int[] nums, int k, int start, int end) {

14         int l=start, r=end;

15         int pivot = r;

16         while (true) {

17             while (nums[l] < nums[pivot] && l<r) {

18                 l++;

19             }

20             while (nums[r] >= nums[pivot] && l<r) {

21                 r--;

22             }

23             if (l == r) break;

24             swap(nums, l, r);

25         }

26         swap(nums, l, end);

27         if (k == l+1) return nums[l];

28         else if (k > l+1) return search(nums, k, l+1, end);

29         else return search(nums, k, start, l-1);

30     }

31     

32     public void swap(int[] nums, int l, int r) {

33         int temp = nums[l];

34         nums[l] = nums[r];

35         nums[r] = temp;

36     }

37 }

 

你可能感兴趣的:(media)