问题
题目:[leetcode-4]
思路
朴素的方法:
- 合并两个序列
- 排序
- 返回中值即可
复杂度主要在第二部的排序上面,O(log(m+n))。可以接收,可行。
好久不用c的排序函数,附带说下。接口为:
void qsort (void* base,
size_t num,
size_t size, //Size in bytes of each element in the array.
int (*compar)(const void*,const void*)); // Pointer to a function that compares two elements.
改进的方法:
考虑到两个序列有序的特性,可以采用merge的思路去做,复杂度是O(m+n).
注意一下几点:
- 归并的框架,循环判断时需要增加是否到达median元素的判断
- 计数器变量设置为实际元素的下标,
- 由于并不需要整个的数组,所以不用额外分配空间。
代码
// c version 朴素的思路
int cmp( const void* a, const void* b )
{
return *(int*)a - *(int*)b;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
if( nums1Size < 0 || nums2Size < 0 )
return -1.0;
int total = nums1Size + nums2Size;
int* arr = (int*)malloc( sizeof(int) * total );
if( !arr )
return -1.0;
int cnt = 0;
for( int i = 0; i < nums1Size; ++i, ++cnt )
arr[cnt] = nums1[i];
for( int j = 0; j < nums2Size; ++j, ++cnt )
arr[cnt] = nums2[j];
qsort( arr, total, sizeof(int), cmp );
int median = total/2;
double ans = (total%2)?1.0*arr[median]:(arr[median-1] + 1.0*arr[median])/2;
free( arr );
return ans;
}
代码1
// c version 归并的思路
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
if( nums1Size < 0 || nums2Size < 0 )
return -1.0;
int total = nums1Size + nums2Size;
int median = total/2;
int i = 0, j = 0;
int ans1 = 0, ans2 = 0;
int cnt = -1;
while( i < nums1Size && j < nums2Size && cnt < median )
{
if( nums1[i] < nums2[j] )
{
++cnt;
if( cnt == median-1 )
{
ans1 = nums1[i];
}
else if( cnt == median )
{
ans2 = nums1[i];
}
++i;
}
else
{
++cnt;
if( cnt == median-1 )
{
ans1 = nums2[j];
}
else if( cnt == median )
{
ans2 = nums2[j];
}
++j;
}
}
while( i < nums1Size && cnt < median )
{
++cnt;
if( cnt == median-1 )
{
ans1 = nums1[i];
}
else if( cnt == median )
{
ans2 = nums1[i];
}
++i;
}
while( j < nums2Size && cnt < median )
{
++cnt;
if( cnt == median-1 )
{
ans1 = nums2[j];
}
else if( cnt == median )
{
ans2 = nums2[j];
}
++j;
}
if( total%2 )
return 1.0*ans2;
else
return(1.0*ans1+ans2)/2;
}