4. 尋找兩個正序數組的中位數
給定兩個大小分别為 m 和 n 的正序(從小到大)數組 nums1 和 nums2。請你找出并傳回這兩個正序數組的 中位數 。
算法的時間複雜度應該為 O(log (m+n)) 。
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數組 = [1,2,3] ,中位數 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數組 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
示例 3:
輸入:nums1 = [0,0], nums2 = [0,0]
輸出:0.00000
示例 4:
輸入:nums1 = [], nums2 = [1]
輸出:1.00000
示例 5:
輸入:nums1 = [2], nums2 = []
輸出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
nums1=append(nums1,nums2...)
sort.Ints(nums1)
if len(nums1)%2!=0{
return float64(nums1[(len(nums1)-1)/2])
}
return float64(nums1[(len(nums1)-1)/2]+nums1[(len(nums1))/2])/2
}
- 如果A[k/2-1]或者B[k/2−1] 越界,那麼我們可以選取對應數組中的最後一個元素。在這種情況下,我們必須根據排除數的個數減少 k 的值,而不能直接将 k 減去 k/2.
- 如果一個數組為空,說明該數組中的所有元素都被排除,我們可以直接傳回另一個數組中第 k 小的元素。
- 如果 k=1,我們隻要傳回兩個數組首元素的最小值即可。
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
totalLength := len(nums1) + len(nums2)
if totalLength%2 == 1 {
midIndex := totalLength/2
return float64(getKthElement(nums1, nums2, midIndex + 1))
} else {
midIndex1, midIndex2 := totalLength/2 - 1, totalLength/2
return float64(getKthElement(nums1, nums2, midIndex1 + 1) + getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0
}
return 0
}
func getKthElement(nums1, nums2 []int, k int) int {
index1, index2 := 0, 0
for {
if index1 == len(nums1) {
return nums2[index2 + k - 1]
}
if index2 == len(nums2) {
return nums1[index1 + k - 1]
}
if k == 1 {
return min(nums1[index1], nums2[index2])
}
half := k/2
newIndex1 := min(index1 + half, len(nums1)) - 1
newIndex2 := min(index2 + half, len(nums2)) - 1
pivot1, pivot2 := nums1[newIndex1], nums2[newIndex2]
if pivot1 <= pivot2 {
k -= (newIndex1 - index1 + 1)
index1 = newIndex1 + 1
} else {
k -= (newIndex2 - index2 + 1)
index2 = newIndex2 + 1
}
}
return 0
}
func min(x, y int) int {
if x < y {
return x
}
return y
}