leetcode 4. 寻找两个正序数组的中位数

题目:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

题解思路:

常规解法是将两个数组合并排序,然后再求中位数。考虑用快速排序或者归并排序。但又由于给定的两个数组都是有序的,优先推荐归并排序,归并一次(O(m+n))即可。排序再找中位数的解法,会增加m+n的内存开销。

归并:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    t := len(nums1) + len(nums2)
    nums := make([]int, t)
    merge(nums, nums1, nums2)
    return getMedian(nums)
}

func getMedian(nums []int) float64 {
    t := len(nums)
    if t % 2 == 0 {
        a := nums[t / 2 - 1]
        b := nums[t / 2]
        return (float64(a) + float64(b)) / 2
    } else {
        return float64(nums[t / 2])
    }
}

func merge(nums []int, nums1 []int, nums2 []int) {
    k := 0
    i := 0
    j := 0

    for k < len(nums) {
        if i >= len(nums1) && j < len(nums2) {
            nums[k] = nums2[j]
            j++
           
        }
        if j >= len(nums2) && i < len(nums1) {
            nums[k] = nums1[i]
            i++
            
        }
        if i < len(nums1) && j < len(nums2) {
            if nums1[i] <= nums2[j] {
                nums[k] = nums1[i]
                i++
                
            } else {
                nums[k] = nums2[j]
                j++
                
            }
        }
        k++
    }
}

leetcode 4. 寻找两个正序数组的中位数_第1张图片

快排:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    t := len(nums1) + len(nums2)
    nums := make([]int, t)
    n := 0
    for i := 0; i < len(nums1); i++ {
        nums[n] = nums1[i]
        n++
    }
    for j := 0; j < len(nums2); j++ {
        nums[n] = nums2[j]
        n++
    }
    quickSort(nums, 0, n - 1)
    return getMedian(nums)
}

func getMedian(nums []int) float64 {
    t := len(nums)
    if t % 2 == 0 {
        a := nums[t / 2 - 1]
        b := nums[t / 2]
        return (float64(a) + float64(b)) / 2
    } else {
        return float64(nums[t / 2])
    }
}

func quickSort(nums []int, lo, hi int) {
    if lo >= hi {
        return
    }
    j := partation(nums, lo, hi)
    quickSort(nums, lo, j - 1)
    quickSort(nums, j + 1, hi)
}

func partation(nums []int, lo, hi int ) int {
    v := nums[lo]
    i := lo + 1;
    j := hi;
    for {
        for(i < hi && nums[i] <= v) {
            i++
        }
        for (j > lo && nums[j] > v) {
            j--
        }
        if i >= j {
            break
        }
        if j == lo {
            break
        }
        exch(nums, i, j)
    }
    exch(nums, lo, j)
    return j
}

func exch(nums []int, a, b int) {
    tmp := nums[a]
    nums[a] = nums[b]
    nums[b] = tmp
}

leetcode 4. 寻找两个正序数组的中位数_第2张图片

你可能感兴趣的:(go,leetcode)