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. DVWA-SQL Injection (Bind) SQL盲注

    盲注同于union select查询注入,盲注只能得到数据库回显的正确和错误,利用返回的正确和错误一个一个判断. LOW 审计源码 <?php if( isset( $_GET[ 'Submit ...

  2. Git添加SSH密钥步骤

    1.先去本机上面看看用户主目录里面有没有.ssh这个文件夹 如果有的话,再看看该目录下有没有id_rsa和id_rsa_pub这两个文件: 若还是有,就直接跳过这一步到下一步:若是没有,我们需要创建S ...

  3. Mathematica的Combinatorica`程序包使用笔记

    目录 官方给出的程序包使用指南和一些示例 引论 步骤 0x00 导入程序包 0x01 Integer Partitions 0x02 Integer Compositions 0x03 partiti ...

  4. Mybatisplus----DML编程控制

    乐观锁 (1)业务并发现象带来的问题:秒杀 执行: 1.在类对象中添加version属性,在数据库表中添加version字段(默认值为1) package com.itheima.domain; im ...

  5. Collection单列集合总结

    这篇文章记录了Collection集合,List集合,Set集合 在文章第七点总结了两大系列集合的五种实现类的区别,有需要的小伙伴可以直接去查看 一.什么是集合 集合是Java中存储对象数据的一种容器 ...

  6. 主板芯片组驱动和Win系统版本互相关联

    主板芯片组驱动和Win系统版本互相关联,过早的系统安装较新版的芯片组驱动,或者较新版本的操作系统安装旧版的芯片组驱动,都可能导致系统不稳定蓝屏.解决方案就是安装最新的芯片组驱动和最新版的操作系统.

  7. urllib.request发送get请求

    发送请求 urllib.request库 模拟浏览器发起一个HTTP请求,并获取请求响应结果 urllib.request.urlopen的语法格式 urllib(url.data = None,[t ...

  8. Windows下解决python pip命令下载慢的方法(超简单)

    首先,常用的国内镜像: 1 https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学(推荐) 2 http://pypi.douban.com/simple/ 豆瓣 ...

  9. selenium验证码处理-获取验证码图片二进流数据转成原图保存

    1.因为视频的作者给的代码不完整,只有核心部分的代码. 2.视频作者示例使用的第三方破解12306的脚本网页(失效了) 所以本人无法复现,此次截取部分代码作为理解核心意思(思想方法最重要) 1.面向对 ...

  10. 安装KubeOperator并导入现有集群进行管理

    安装KubeOperator并导入现有集群进行管理 介绍 KubeOperator 是一个开源的轻量级 Kubernetes 发行版,专注于帮助企业规划.部署和运营生产级别的 Kubernetes 集 ...