題目.
很有意思
問題的關鍵在於,把尋找中位數變成尋找第k個數(中位數只是一種特殊情況)。可以假設這種場景:對於兩個陣列:第乙個陣列的前k/2個數和第二個陣列的前k/2個數,一定可以拋棄k/2個。假設第乙個陣列的第k/2個數小於第二個陣列的第k/2個數,那麼對第乙個陣列的前k/2個數來說,第k個數一定不會出現在這k/2個數中。可以利用反證法:
假設第k個數出現在第乙個陣列的前k/2中,比第k個數小的不超過k/2個,而第二個陣列中比第k個數小的數不到k/2,這樣總的比第k個數小的數就沒有k個,這就違背了邏輯。
package main
import
("fmt"
)func
findkthnum
(k int
, nums1 [
]int
, nums2 [
]int
)int
iflen
(nums2)==0
if k ==
1return nums1[0]
} half1 := k /2if
len(nums1)
< half1
half2 := k /2if
len(nums2)
< half2
fmt.
println
(k,len
(nums1)
,len
(nums2)
, half1, half2)
if nums1[half1-1]
< nums2[half2-1]
return
findkthnum
(k-half2, nums1, nums2[half2:])
}func
findmediansortedarrays
(nums1 [
]int
, nums2 [
]int
)float64
return
float64
(findkthnum
(count/2+
1, nums1, nums2))}
func
main()
,[]int))
}
o(log(m+n))
o(log(m+n))
執行用時 :16 ms, 在所有 go 提交中擊敗了93.16%的使用者
記憶體消耗 :5.7 mb, 在所有 go 提交中擊敗了62.71%的使用者
尋找兩個有序陣列的中位數
尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...
尋找兩個有序陣列的中位數
思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...
尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...