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.
java
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
if (nums == null || nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return nums[0];
}
return util(nums, 0, nums.length - 1, (nums.length - 1) / 2);
}
private int util(int[] nums, int start, int end, int k) {
if (start > end) {
return -1;
}
int left = start;
int right = end;
int pivot = nums[(left + right) / 2];
while (left <= right) {
while (left <= right && nums[left] < pivot) {
left++;
}
while (left <= right & nums[right] > pivot) {
right--;
}
if (left <= right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
if (k <= right) {
return util(nums, start, right, k);
} else if (k >= left) {
return util(nums, left, end, k);
} else {
return nums[k];
}
}
}
class Solution:
"""
@param: nums: A list of integers
@return: An integer denotes the middle number of the array
"""
def median(self, nums):
# write your code here
if nums == None or len(nums) == 0:
return -1
return self.quickSelect(nums, 0, len(nums) - 1, (len(nums) - 1) / 2)
def quickSelect(self, nums, start, end, k):
if start > end:
return -1
left, right = start, end
pivot = nums[(left + right) / 2]
while left <= right:
while left <= right and nums[left] < pivot:
left += 1
while left <= right and nums[right] > pivot:
right -= 1
if left <= right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
if k <= right:
return self.quickSelect(nums, start, right, k)
elif k >= left:
return self.quickSelect(nums, left, end, k)
else:
return nums[k]