Go語言的LeetCode刷題之旅-004-兩個排序數組的中位數
題目:
給定兩個大小爲 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
思路:
輸入兩個已經排序好的整數切片,合併兩個切片,返回合併後切片的中位數。
所以,題目的關鍵是,如何高效地合併切片。
Go代碼:
package problem0004
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
nums := combine(nums1, nums2)
return medianOf(nums)
}
func combine(mis, njs []int) []int {
lenMis, i := len(mis), 0
lenNjs, j := len(njs), 0
res := make([]int, lenMis+lenNjs)
for k := 0; k < lenMis+lenNjs; k++ {
if i == lenMis ||
(i < lenMis && j < lenNjs && mis[i] > njs[j]) {
res[k] = njs[j]
j++
continue
}
if j == lenNjs ||
(i < lenMis && j < lenNjs && mis[i] <= njs[j]) {
res[k] = mis[i]
i++
}
}
return res
}
func medianOf(nums []int) float64 {
l := len(nums)
if l == 0 {
panic("切片的長度爲0,無法求解中位數。")
}
if l%2 == 0 {
return float64(nums[l/2]+nums[l/2-1]) / 2.0
}
return float64(nums[l/2])
}
解法2:
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
for _,k:=range nums2{
nums1=append(nums1,k)
}
x :=len(nums1)
for i:=0;i<x-1;i++{
for j:=0;j<len(nums1)-1-i;j++{
if nums1[j]>nums1[j+1]{
nums1[j],nums1[j+1]=nums1[j+1],nums1[j]
}
}
}
var res float64
if(x%2==0){
y :=x/2
res = float64((nums1[y]+nums1[y-1]))/2
}else {
y:=x/2
res = float64(nums1[y])
}
return res
}