首页 > 编程语言 >练习:分治算法--有序数组寻找中位数

练习:分治算法--有序数组寻找中位数

时间:2023-09-10 19:11:21浏览次数:36  
标签:nums -- array2 array1 分治 中位数 数组 nums3

题: 给定两个长度为m 和 n 有序组数array1 和array2,请找出这个有序数组的中位数。
'''
eg.
[1,3]和[5,6],中位数是4
[1,2,5,8,9]和[2,3,4,5],中位数是4
'''
### 直接方法,使用内置排序函数sort
# 时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)
 1 class Solution(object):
 2     def findmedian(self,nums1,nums2):
 3         nums3=nums1+nums2
 4         nums3.sort()
 5         return (nums3[len(nums3)//2]+nums3[(len(nums3)-1)//2])/2
 6 # eg.
 7 nums1=[1,2,5,8,9]
 8 nums2=[2,3,4,5]
 9 demo=Solution()
10 re=demo.findmedian(nums1,nums2)
11 print(re) # 4.0 再取个整
### 利用双指针将两个数组排序
# 时间复杂度最高:O(n+m),空间复杂度:O(n+m)
 1 class Solution2(object):
 2     def findmedian(self,nums1,nums2):
 3         nums3=[]
 4         j=i=0
 5         # 利用双指针将两个数组排序
 6         while(i<len(nums1) and j<len(nums2)):
 7             if nums1[i]<nums2[j]:
 8                 nums3.append(nums1[i])
 9                 i+=1
10             else:
11                 nums3.append(nums2[j])
12                 j+=1
13         if i==len(nums1) and j!=len(nums2):
14             for x in nums2[j:]:
15                 nums3.append(nums2[x])
16         if j==len(nums2) and i!=len(nums1):
17             for x in nums1[i:]:
18                 nums3.append(nums1[x])
19         # 返回len(nums3)/2 和(len(nums3)-1)/2 向下取整的均值
20         return (nums3[len(nums3) // 2] + nums3[(len(nums3) - 1) // 2]) / 2
### 采用二分法,再分治处理
# 时间复杂度最高:O(log(min(n+m))),空间复杂度:O(1)
 1 class Solution3:
 2     # 定义一个取数组中位数的函数
 3     def getmediannum(self,nums):
 4         return (nums[len(nums) // 2] + nums[(len(nums) - 1) // 2]) / 2
 5 
 6     def findmedian(self,array1,array2):
 7         len1=len(array1)
 8         len2=len(array2)
 9         # array1为短数组,array2为短数组,不符合则换
10         if len1>len2:
11             return self.findmedian(array2,array1)
12 
13         if len1<=2: # 较短的数组长度小于等于2
14             if len2>4:  # 较长的数组长度大于4,
15                 p1=math.ceil(len2/2)-2  # math.ceil()向上取整
16                 array2=array2[p1:-p1]   # 取数组中间部分
17             # 合并两部分再排序
18             nums=array1+array2
19             nums.sort()
20             # 可以直接对剩余部分寻找中位数
21             return self.getmediannum(nums)
22 
23         p2=math.ceil(len1/2)-1
24         # 较短的数组长度大于2
25         # 当较短的数组的中位数较小时,array1 中位数之前的所有元素就被截去,array2 尾部截去相同的长度,再递归两数组
26         if self.getmediannum(array1)<self.getmediannum(array2):
27             return self.findmedian(array1[p2:],array2[:-p2])
28         else:
29             return self.findmedian(array1[:-p2],array2[p2:])
30 # eg.
31 nums1=[1,2,5,8,9]
32 nums2=[2,3,4,5]
33 demo3=Solution3()
34 re=demo3.findmedian(nums1,nums2)
35 print(re) # 4.0 再取个整

2023-9-10笔记

标签:nums,--,array2,array1,分治,中位数,数组,nums3
From: https://www.cnblogs.com/yuntimer/p/17691692.html

相关文章

  • 纯前端也可以访问文件系统!
    前言周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它居然真的可以打开我本地的项目代码!难道又出了新的API让......
  • 2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算
    2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单req_skills,并打算从备选人员名单people中选出些人组成一个「必要团队」(编号为i的备选人员people[i]含有一份该备选人员掌握的技能列表)。所谓「必要团队」,就是在这个团队中,对于所需求的技能列表req_skills......
  • SpringBoot 如何实现文件上传和下载
    当今Web应用程序通常需要支持文件上传和下载功能,SpringBoot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍SpringBoot如何实现文件上传和下载,同时提供相应的代码示例。 文件上传SpringBoot提供了Multipart文件上传的支持。Multipart是HTTP协议中的一种......
  • 2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算
    2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单req_skills,并打算从备选人员名单people中选出些人组成一个「必要团队」(编号为i的备选人员people[i]含有一份该备选人员掌握的技能列表)。所谓「必要团队」,就是在这个团队中,对于所需求的技能列表req_sk......
  • buildozer配置说明
    要配置buildozer,需要打开buildozer.spec文件进行编辑。该文件包含了所有构建AndroidAPK所需的配置选项,例如应用程序名称、包名、版本号、支持的最低API级别、使用的库等。 以下是一些常用的配置选项: 1.application:应用程序名称``` #(str)Applicationname appna......
  • 《信息安全系统设计与实现》第一周学习笔记
      </d  第一章知识点归纳:1。进程:进程是计算机中正在运行的程序的实例。在操作系统中,每个进程都有自己独立的内存空间和执行环境。进程可以包含一个或多个线程,每个线程执行进程的一部分任务。进程之间是相互独立的,它们通过进程间通信(IPC)来进行数据交换和协调。每个进程......
  • mybatisplus中按照条件查询的三种方式,常用的是lambda查询,当进行测试查询的时候,可以将
    2023-09-10目录结构 logback.xml<?xmlversion="1.0"encoding="UTF-8"?><configuration></configuration>application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://loca......
  • 面试手撕合集
    一、设计模式1.单例模式2.观察者模式(信号与槽、智能指针?) 二、排序算法1.简答排序2.冒泡排序3.快速排序4.归并排序5.堆排序 三、查找算法1.二分查找 四、字符串题1.实现strstr()2.实现strcpy()3.实现strcmp()4. ......
  • js详细讲解放大镜的实现
    实现放大镜的整体思路1.当鼠标放在图片上的时候,出现蒙层。2.出现蒙层,让鼠标在蒙层中心3.限制蒙层移动的范围4.放大镜移动最终实现的效果鼠标放上去的时候,出现一个蒙层。蒙层的移动范围只能在图片里,不能超出范围。移动蒙层时,右侧会出现图片的放大部分。移除图片的范围,......
  • Redis基础
    1.什么是RedisRedis是一个基于C语言开发的内存数据库,读写速度非常快,广泛应用于缓存方向。并且,Redis存储的是KV键值对数据。Redis内置了多种数据类型实现(比如String、Hash、SortedSet、Bitmap)。并且,Redis还支持事务、持久化、Lua脚本、多种开箱即用的集群方案(RedisSe......