2021-06-29:在两个都有序的数组中找整体第K小的数。

福大大 答案2021-06-29:

1.A和B长度不等的时候,需要把A和B的长度变成相等。
A是短数组,B是长数组。
第k小的数,k从1开始。
k<=短,都取前k个数,变成等长。
短<k<=长,长取中,长扣1。
长<k<=和,两个数组都取后 变成等长,两个数组都需要扣掉1个元素,小被干,都需要扣掉左边。

2.A和B长度相等的时候。分长度是偶数和长度是奇数两种情况。都是求中位数。
2.1.A和B长度相等,并且长度是偶数。
A=[A1,A2,A3,A4]
B=[B1,B2,B3,B4]
当A2==B2时,取A2。
当A2>B2时,B1、B2、A3、A4去掉。递归。

2.2.A和B长度相等,并且长度是奇数。
A=[A1,A2,A3,A4,A5]
B=[B1,B2,B3,B4,B5]
当A3==B3时,取A3。
当A3>B3时,B1、B2、A3、A4、A5去掉。当A2<=B3时,取B3;否则去掉B3,递归。

时间复杂度是O(log(min(M,N)))。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
arr1 := []int{1, 3}
arr2 := []int{2}
ret := findMedianSortedArrays(arr1, arr2)
fmt.Println(ret)
} func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
size := len(nums1) + len(nums2)
even := (size & 1) == 0
if len(nums1) != 0 && len(nums2) != 0 {
if even {
return float64(findKthNum(nums1, nums2, size/2)+findKthNum(nums1, nums2, size/2+1)) / 2.0
} else {
return float64(findKthNum(nums1, nums2, size/2+1))
}
} else if len(nums1) != 0 {
if even {
return float64((nums1[(size-1)/2] + nums1[size/2]) / 2)
} else {
return float64(nums1[size/2])
}
} else if len(nums2) != 0 {
if even {
return float64((nums2[(size-1)/2] + nums2[size/2]) / 2)
} else {
return float64(nums2[size/2])
}
} else {
return 0
}
} // 进阶问题 : 在两个都有序的数组中,找整体第K小的数
// 可以做到O(log(Min(M,N)))
func findKthNum(arr1 []int, arr2 []int, kth int) int {
longs := twoSelectOne(len(arr1) >= len(arr2), arr1, arr2)
shorts := twoSelectOne(len(arr1) < len(arr2), arr1, arr2)
l := len(longs)
s := len(shorts)
if kth <= s { // 1)
return getUpMedian(shorts, 0, kth-1, longs, 0, kth-1)
}
if kth > l { // 3)
if shorts[kth-l-1] >= longs[l-1] {
return shorts[kth-l-1]
}
if longs[kth-s-1] >= shorts[s-1] {
return longs[kth-s-1]
}
return getUpMedian(shorts, kth-l, s-1, longs, kth-s, l-1)
}
// 2) s < k <= l
if longs[kth-s-1] >= shorts[s-1] {
return longs[kth-s-1]
}
return getUpMedian(shorts, 0, s-1, longs, kth-s, kth-1)
} // A[s1...e1]
// B[s2...e2]
// 一定等长!
// 返回整体的,上中位数!8(4) 10(5) 12(6)
func getUpMedian(A []int, s1 int, e1 int, B []int, s2 int, e2 int) int {
mid1 := 0
mid2 := 0
for s1 < e1 {
// mid1 = s1 + (e1 - s1) >> 1
mid1 = (s1 + e1) / 2
mid2 = (s2 + e2) / 2
if A[mid1] == B[mid2] {
return A[mid1]
}
// 两个中点一定不等!
if ((e1 - s1 + 1) & 1) == 1 { // 奇数长度
if A[mid1] > B[mid2] {
if B[mid2] >= A[mid1-1] {
return B[mid2]
}
e1 = mid1 - 1
s2 = mid2 + 1
} else { // A[mid1] < B[mid2]
if A[mid1] >= B[mid2-1] {
return A[mid1]
}
e2 = mid2 - 1
s1 = mid1 + 1
}
} else { // 偶数长度
if A[mid1] > B[mid2] {
e1 = mid1
s2 = mid2 + 1
} else {
e2 = mid2
s1 = mid1 + 1
}
}
}
return getMin(A[s1], B[s2])
} func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
} func twoSelectOne(c bool, a []int, b []int) []int {
if c {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2021-06-29:在两个都有序的数组中找整体第K小的数。的更多相关文章

  1. 两个有序数组的中位数(第k大的数)

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路. ...

  2. 求两个有序数组的中位数或者第k小元素

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 设两个数组分别是vec1和vec2,元素数目分别是n1.n2. 算法1:最简单的办法就是把两个数 ...

  3. 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  4. 每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数

    1.取上中位数 题目: 给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数.要求:时间复杂度O(logN).      例如:          arr1 = {1, ...

  5. 算法总结之 在两个排序数组中找到第K小的数

    给定两个有序数组arr1 和 arr2 ,再给定一个int K,返回所有的数中第K小的数 要求长度如果分别为 N M,时间复杂度O(log(min{M,N}),额外空间复杂度O(1) 解决此题的方法跟 ...

  6. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  7. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

  8. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  9. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  10. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

随机推荐

  1. vue项目怎么链接开发服务器

    在前后端分离的前提下,完成前端的页面开发,就可以开始链接开发服务器 安装axios到项目中 npm install axios --save 安装完成后问你的后端开发人员要IP 后端会给一个IP以及端 ...

  2. 在MDK 5中打开MDK 4工程要注意的问题1

    我是生手,对于MDK的理解还很简单.以下内容是遇到的一种情况. 有一个MDK 4工程,要求顺序点亮4个LED灯,工程已经建好. 在MDK 5中打开,编译都没问题,要烧写时,提示"can no ...

  3. 11. ASCII, unicode, utf-8, gbk的区别

    这是几种编码方式 ASCII是包含英文字母数字特殊字符等, 长度是1字节, 前128个是基础ASCII码, 128个以后是扩展ASCII码 GBK是国标扩展码, 长度2字节, 表示汉字以及各少数民族语 ...

  4. 《MySQL是怎样运行的》第八章小结

  5. java的数据和表达式

    一.基本语法元素 1.空白和注释及语句 (1)空白: 换行符.回车符.空格键.水平定位键(Tab) 编译器会忽略掉多余的空白 作用:增加程序的易读性 (2)注释:主要作用是将代码解释其功能和作用,在编 ...

  6. 如何让excel不转换科学技术法

    使用场景: 业务部门从系统导出数据给开发人员,打开后数字全部变为科学计数法 参考文章:https://www.zhihu.com/question/20096750

  7. Hadoop 安装及目录结构

    一.准备工作 [1]创建用户:useradd 用户名[2]配置创建的用户具有 root权限,修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:(注意:需要先给sud ...

  8. MyBatis 整体架构【包含 SQL执行流程】

    Mybatis 的整体架构分为三层,分别是基础支持层.核心处理层和接口层.基础支持层为核心处理层的功能提供了良好的支撑.

  9. SQL Server底层架构技术对比

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...

  10. JS中关于原型对象与原型链的理解!

    1.首先我们先来看一张图 prototype 每个函数都有一个 prototype 属性每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每 ...