设定一个中点,确保中点的值就是我们要找的中位数,这样我们只需要用一个循环就可以解决问题,当到达中间点位置的时候跳出循环。
过程中,设定了一个标志 j , j 可以充当一个从前到后便利的标志,j 之前的是已经排好顺序的值。
class Solution {
public:
/*
* @param : A list of integers
* @return: An integer denotes the middle number of the array
*/
int median(vector<int> &nums) {
// write your code here
int num = nums.size();
int a, j = 0;
if(num == 0) return 0;
if(num % 2 != 0)
{
a = (num + 1) / 2;
}
else
{
a = num / 2;
}
for(int i = 0; i < num; i++)
{
if(nums[i] < nums[j])
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
if(j == a)
{
break;
}
if(i == num - 1)
{
j++;
i = j;
}
}
return nums[j - 1];
}
};
通过分析,我们可以通过快排来简化过程。分别从左右两边开始找,找出分界点,左边的数都小于分界点的值,右边的数都大于分解点的值,只要不断调用函数折半查找,直到找到了中间点位置,不再进行循环。这样就减少了时间复杂度。
class Solution {
public:
/**
* @param nums: A list of integers.
* @return: An integer denotes the middle number of the array.
*/
int Qsort(vector<int>&nums,int low,int high)
{
int i = low;
int j = high;
int key = nums[low];
while(i < j)
{
while(i < j && nums[j] >= key)
{
j--;
}
swap(nums[i], nums[j]);
while (i < j && nums[i] <= key)
{
i++;
}
swap(nums[i], nums[j]);
}
//nums[i]=key;
return i;
}
int median(vector<int> &nums) {
// write your code here
int n = nums.size();
int key = 0,k = 0;
int left = 0, right = n - 1;
if(n % 2 == 0) key = n / 2 - 1;
else
{
key = n / 2;
}
k = Qsort(nums, 0, n - 1);
while (k != key)
{
if(k < key)
{
left = k + 1;
k = Qsort(nums, left, right);
}
else
{
right = k - 1;
k = Qsort(nums, left, right);
}
}
return nums[key];
}
};
2018/1/26