Go語言的LeetCode刷題之旅-004-兩個排序數組的中位數

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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章