leetcode之寻找两个有序数组的中位数Golang

算法的要求的时间复杂度是O(m+n)

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	// 获取两个数组的长度
	nums1Length := len(nums1)
	nums2Length := len(nums2)
	// 总长度
	sumLength := nums1Length + nums2Length
	halfLength := 0
	// 确定半长,因为如果总长度是偶数,那么中位数就是两个数字的和除以2,如果总长度是奇数,那么中位数就是一位数字
	if sumLength%2 != 0 {
		halfLength = (sumLength + 1) / 2
	} else {
		halfLength = sumLength / 2
	}
	// 这三个用来存储临时变量,也就是和中位数有关的一位或者两位数字
	tmpNum0, tmpNum1, tmpNum2 := 0, 0, 0
	// 题目要求时间复杂度是O(m+n),所以使用两个下标来遍历两个数组
	nums1Index, nums2Index := 0, 0
	// 这个循环就是最后找到中位数,循环比总长度的一半多找了后面的一个数字,
	// 这样的目的是当中位数是两个数字的时候,一次性就找出这两个数字,代码看起来会简单一点
	// 最开始我循环的临界是i<halfLength,这样的结果是当中位数是两个数字的时候,后面会有很大一部分重复代码
	for i := 0; i <= halfLength; i++ {
		// 第一个条件判断是当两个数组都还没有越界的时候,所以需要取两个数组中较小的那个数字
		if nums1Length > nums1Index && nums2Length > nums2Index {
			// 取了某个数组中的数字,那个数组的下标就向后加1
			// 使用tmpNum0保存临时值
			if nums1[nums1Index] <= nums2[nums2Index] {
				tmpNum0 = nums1[nums1Index]
				nums1Index++
			} else {
				tmpNum0 = nums2[nums2Index]
				nums2Index++
			}
		} else if nums1Length <= nums1Index && nums2Length > nums2Index {
			// 当数组nums1已经发生了越界,那么此时只剩nums2,所以取nums2的数字
			tmpNum0 = nums2[nums2Index]
			nums2Index++
		} else if nums1Length > nums1Index && nums2Length <= nums2Index {
			// 当数组nums2已经发生了越界,那么此时只剩nums1,所以取nums1的数字
			tmpNum0 = nums1[nums1Index]
			nums1Index++
		}
		// 之前取出的数字保存在临时变量tmpNum0中
		// 之前的值一直保存在tmpNum1中,tmpNum1一直在更新,直到更新到最中间的数字,或者中间的两个数字中较小的那个
		// 只有最后一个数字,也就超过半数的那个数字保存tmpNum2中
		if i < halfLength {
			tmpNum1 = tmpNum0
		} else {
			tmpNum2 = tmpNum0
		}
	}
	if sumLength%2 != 0 {
		// 此时中位数就只有一个
		return float64(tmpNum1)
	} else {
		// 此时中位数是中间的两个数字的和除以2
		return float64(float64((tmpNum1 + tmpNum2)) / 2)
	}
}

  总之最关键的是使用nums1Index和nums2Index两个下标同时遍历两个数组,就能确保时间复杂度达到要求。

  然后遍历的时候,看哪个数组的当前下标对应的值小,就选用哪个数组的值

  当某个数组的下标发生了越界,那么后面的数字都选自另一个数组

  不可能发生两个数组同时越界的情况

原文地址:https://www.cnblogs.com/gyyyl/p/12680845.html

时间: 2024-10-31 04:57:20

leetcode之寻找两个有序数组的中位数Golang的相关文章

[LeetCode] 4. 寻找两个有序数组的中位数

题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例: 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] n

leetcode题 寻找两个有序数组的中位数

题目描述: 我的成绩: 成绩不是很好,代码本身写的也很乱,本文只是提供一种解题思路. 题目分析: 要求两有序数组的中位数并不难,简单粗暴的方法就是得到两数组合并后的新数组,取其中位数即可,但是难度在于这个时间复杂度有限制,为 O(log(m + n)). 一看这个log,那么很容易想到二分查找算法什么的,而本文的解题过程也正是按照二分的思路来的.通过每次比较两数组的二分位点,来进行中位数的筛选. 解题步骤: 例:有两有序数组L1=[1, 2, 6, 12, 34, 36, 39, 43, 51,

[leetcode]4寻找两个有序数组的中位数

这道题要求算法时间复杂度为log(m+n)一般来讲这是二分法的复杂度,但两个数组之间交叉起来不能简单靠二分法来解决,必须进行合并,但一合并复杂度就是m+n,所以这题有点奇怪 我采用python来做,非常简单,也通过了,但是还是不清楚复杂度是如何判断的 1 def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: 2 nums1=nums1+nums2 3 nums1.sort() 4 long=l

Leetcode(4)寻找两个有序数组的中位数

Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1* 和 nums2 不会同时为空. 第一种方法:list拼接排列取中位数 执行用时:116 ms : 内存消耗:11.8MB 效果:还行 class Solution(object): def findMedianSortedArrays(self,

算法实战(四)寻找两个有序数组的中位数

一.前言 今天开始第四题,寻找两个有序数组的中位数.这个题leetcode的标记难度是困难,这一看可把我吓坏了,之前还没做过困难的题目.但是进去一看,感觉题目挺简单的,还小小的高兴了一会儿,以为是自己的水平变高了.结果打脸来的太快,漏看了一个条件,要求时间复杂度为O(log(n+m)),果然还是有难度的.话不多说.来看题目. 二.题目 题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))

LeetCode寻找两个有序数组的中位数

题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3]nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2]nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 来源:力扣(LeetCode) 链接:https://leetcode-cn.

【LeetCode】4. 寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 分析:给定两个有序的数组,求中位数,难度系数给的是 Hard,希望的复杂度是 lo

leetcode刷题四&lt;寻找两个有序数组的中位数&gt;

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 思路简单直接撸代码吧 double findMedianSortedArrays(

LeetCode刷题:第四题 寻找两个有序数组的中位数

题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 直接上代码: double findMedianSortedArray