leetcode之寻找两个有序数组的中位数Golang
时间:2020-04-11
本文章向大家介绍leetcode之寻找两个有序数组的中位数Golang,主要包括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
- 服务器增加内存后无法重启数据库的问题及解决 (36天)
- 分区表放入keep pool,recycle pool的问题及解析(34天)
- 临时表空间故障处理 (33天)
- 关于物化视图疑问(32天)
- ORACLE 10g 升级 11g问题汇总(31天)
- 数据库11g升级中一次奇怪的问题 (30天)
- 10g升级至11g需要考虑的参数优化(29天)
- 关于oracle invalid components问题的解决(28天)
- 11g升级性能问题之一 重建user_synonyms (笔记27天)
- 数据库shutdown之后无法启动的问题 (46天)
- 关于oracle里的process总结(45天)
- 通过top命令抓取cpu高消耗的sql (44天)
- 关于字符串匹配查找的总结(43天)
- 一条sql语句导致的数据库宕机问题及分析(42天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用php来查询graphql
- 利用树莓派的摄像模块实现“扫码枪”
- n ../../node_modules/@storybook/channels/dist/index.d.ts:25:9 - error TS1086: An accessor cannot ...
- 要不来重新认识Spring事务?三歪又学到了
- 读者问:学完SSM,该学什么呢?
- go-zero 微服务框架介绍
- redis-cli 未找到命令的一个解决方式
- 【每日一题】42. Trapping Rain Water
- iframe跨域安全
- Efficiently traversing InnoDB B+Trees with the page directory (9.利用页目录实现对B+树的高效遍历)
- C语言 | 每日基础(37)
- 《求求大厂给个Offer》Map面试题
- C语言 | 每日基础(40)
- kubernete编排技术七:secret
- springcloud+eureka整合seata-tcc模式