1.描述
给定一个未排序的整数数组,找到其中位数。
中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。
2.分析
首先对着干数组进行快速排序,之后返回中间值即可。
3.代码
class Solution {
public:
/**
* @param nums: A list of integers.
* @return: An integer denotes the middle number of the array.
*/
int Partition(vector<int>& nums,int first,int end)
{
int i=first;
int j=end;
int t;
while(i<j)
{
while(i<j&&nums[i]<=nums[j]) j--;
if(i<j)
{
t=nums[i];
nums[i]=nums[j];
nums[j]=t;
i++;
}
while(i<j&&nums[i]<=nums[j]) i++;
if(i<j)
{
t=nums[j];
nums[j]=nums[i];
nums[i]=t;
j--;
}
}
return i;
}
void QuickSort(vector<int>& nums,int first,int end)
{
if(first<end)
{
int pivot=Partition(nums,first,end);
QuickSort(nums,first,pivot-1);
QuickSort(nums,pivot+1,end);
}
}
int median(vector<int> &nums) {
// write your code here
QuickSort(nums,0,nums.size()-1);
/*for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<endl;
}*/
return nums[((nums.size()+1)/2)-1];
}
};
public:
/**
* @param nums: A list of integers.
* @return: An integer denotes the middle number of the array.
*/
int Partition(vector<int>& nums,int first,int end)
{
int i=first;
int j=end;
int t;
while(i<j)
{
while(i<j&&nums[i]<=nums[j]) j--;
if(i<j)
{
t=nums[i];
nums[i]=nums[j];
nums[j]=t;
i++;
}
while(i<j&&nums[i]<=nums[j]) i++;
if(i<j)
{
t=nums[j];
nums[j]=nums[i];
nums[i]=t;
j--;
}
}
return i;
}
void QuickSort(vector<int>& nums,int first,int end)
{
if(first<end)
{
int pivot=Partition(nums,first,end);
QuickSort(nums,first,pivot-1);
QuickSort(nums,pivot+1,end);
}
}
int median(vector<int> &nums) {
// write your code here
QuickSort(nums,0,nums.size()-1);
/*for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<endl;
}*/
return nums[((nums.size()+1)/2)-1];
}
};
4.总结
这里注意中间的数为(length+1)/2,考虑到是在数组中因此实际位置为(length+1)/2-1.