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. .bat 脚本替换文件内容

    rem 定义变量延迟环境,关闭回显 @echo off&setlocal enabledelayedexpansion rem 读取a.txt所有内容 for /f "eol=* t ...

  2. 第八次团队作业:Beta冲刺(凡事预则立)

    这个作业属于哪个课程 2018级计算机和综合实验班 这个作业要求在哪里 Beta冲刺要求 这个作业的目标 Beta冲刺 改进完善的功能 完善之前年度报告功能 尽快上线小程序 增加的新功能 小程序打卡功 ...

  3. 经典面试题:UDP和TCP的区别?

    相信测试这行的同道朋友们,经常会被问到这个问题,这里我用自己的语言总结了几点: UDP 和 TCP的区别: 连接方面:tcp面向连接,三次握手,四次挥手 udp无连接,即发送数据之前不需要建立连接 安 ...

  4. DVWA-SQL Injection(SQL注入)

    sql注入是典型.常见的Web漏洞之一,现在在网络中也可能存在,不过大多数为SQL盲注. 攻击者通过恶意的SQL语句来破坏SQL查询语句,达到数据库泄露的目的 LOW 审计源码 <?php // ...

  5. Java笔记第十三弹

    函数式接口 有且仅有一个抽象方法的接口 适用于Lambda使用的接口 @FunctionalInterface//表示函数式接口 函数式接口作为方法的参数 public class Main{ pub ...

  6. linux 常用的查找命令

    linux 常用的查找命令 查找文件内容 grep grep -nr "str" path -nr: n是line number行号,r是recursive,可以理解为遍历文件文件 ...

  7. Gitee 码云与Git 交互

    一.进入码云官方网站,注册用户 官网地址:https://gitee.com/ 二.创建远程仓库 [1]点击右上角的 + 号进行创建

  8. EX6新增的字符串

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 集合-LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  10. go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目)

    go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目) 前面两篇跑通了demo项目,和大概了解了kratos demo整体结构,本篇分别构建一个http和一个grpc微服 ...