給定兩個大小為 m 和 n 的有序陣列nums1和nums2。
請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。
nums1 = [1, 3]nums2 = [2]
中位數是 2.0
nums1 = [1, 2]本來可以歸併排序,直接求中位數,但是由於有時間複雜度要求,所以採用快排的思想找中位數。nums2 = [3, 4]
中位數是 (2 + 3)/2 = 2.5
快速排序的思想是分治,將乙個陣列分成兩塊之後再進行排序,也就是說,如果採用分治,由於中位數的下標是固定的,當劃分點的下標 < 中位數下標,此時就去劃分點右邊去找,反之就去左邊,和二分查詢的方式很像,這種查詢方式的時間複雜度正好為log(m + n)。
我們要做的就是先把陣列合併,然後用快排的思想進行分割槽,直至分割槽下標 = 中位數下標,此方法也可以找無序陣列的中位數。
int quickmove(int* arr, int left, int right);//快排思想找中位數
void swap(int* x1, int * x2);//交換函式
double findmediansortedarrays(int* nums1, int nums1size, int* nums2, int nums2size)
else
}ret = (double)num[div];
if (size % 2 == 0)
else
}ret += (double)num[div];
free(num);//釋放掉申請的空間,不能忘
return ret / 2;
}free(num);
return ret;
}int quickmove(int* arr, int left, int right)
}fast++;
}slow++;
swap(arr + slow, arr + right);
return slow;
}void swap(int* x1, int * x2)
*x1 ^= *x2;
*x2 ^= *x1;
*x1 ^= *x2;
}
leetcode 4 兩個排序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0 示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 思路 兩個陣...
LeetCode4 兩個排序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 兩個有序陣列,...
LeetCode 4 兩個排序陣列的中位數
題目描述 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2均不為空。困難題,要求演算法時間複雜度為o log m n 也就是最優方法 參考解法 二分法查詢,每次捨棄部分區間 pu...