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

算法题_求两个排序数组中第k小的数字 目录题目描述思路 题目描述 一道算法题:求两个排序数组的第k小的数字 描述:给定两个升序排序数组a、b,要求求出其中第k大的数字 例子:a = [1,2,3,4,5,6] b = [3,4,5,6,7,8,9] k = 5 得到结果为:4 思路 最直接的思路是归并排序后直接返回,但这样的时间空间复杂度都比较大,而且也比较没必要。 后来想到可以通过在两个数组中从头开始从左向右搜索,记录搜索个数,当搜索到第k个时即返回,这样的时间复杂度为O(n),空间复杂度为O(1)(n为元素总数) 参考其他 阅读详情

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

给定两个有序数组arr1 和 arr2 ,再给定一个int K,返回所有的数中第K小的数

要求长度如果分别为 N M,时间复杂度O(log(min{M,N}),额外空间复杂度O(1)

 

解决此题的方法跟之前的求两个数组求中位数的情况,如出一辙~ 非常给力!

 此题目需要分情况讨论: 

    假设长度较短的数组长度 lenS   较长的lenL

    情况1、 K<1  或者 K>lenS+lenL    k值无效

    情况2、 k<=lenS  分别在两数组选择第前 k个数, 然后取其中位数

    情况3、 k>lenL  

package TT;

public class Test13 {

  public static int getUpMedian(int[] a1, int s1, int e1,int[] a2, int s2, int e2){
         int mid1 = 0;
         int mid2 =0;
         int offset = 0;
         while(s1<e1){
             mid1 = (s1+e1) /2;
             mid2 = (s2+e2) /2;
             offset = ((e1-s1+1)&1)^1;
             if (a1[mid1]>a2[mid2]) {
                 e1 = mid1;
                 s2 = mid2+offset;        
            }else if(a1[mid1]<a2[mid2]){
                s1 = mid1 + offset;
                e2= mid2;
            }else {
                return a1[mid1];
            }
             
             
             
         }
         
      return Math.min(a1[s1], a2[s2]);
      
  }    
    
  public static int findKthNum(int[] arr1, int[] arr2, int kth){
      
      
      if(arr1==null || arr2==null){
          throw new RuntimeException("are you ok?");
      }
      if(kth<1 || kth>arr1.length+arr2.length){
          
          throw new RuntimeException("too long");
          
      }
      int[] longs = arr1.length >=arr2.length ? arr1 :arr2;
      int[] shorts = arr1.length <arr2.length ? arr1 :arr2;
      
      int l  = longs.length;
      int s = shorts.length;
      
      if(kth <= s){
          return getUpMedian(shorts, 0, kth-1, longs, 0, kth-1);
      }
      
      if(kth>l){
          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);
          
      }
      
      if (longs[kth-s-1]>=shorts[s-1]) {
           return longs[kth -s -1];
    }
      return getUpMedian(shorts, 0, s-1, longs, kth-s, kth-1);
      
  }
    
  
  public static void main(String[] args ){
      
      int[] a1 = new int[4];
      int[] a2 = new int[4];
       
      a1[0]=0;  a1[1]=1;  a1[2]=2; a1[3]=3;
      a2[0]=4;  a2[1]=5;  a2[2]=5; a2[3]=6;
      
      int kth=4;
      
      int c = findKthNum( a1, a2, kth);
      System.out.println(c);
      
      
      
      
  }
  
  
  
    
}

结果:

 

posted @ 2017-08-23 16:13 toov5 阅读( ...) 评论( ...) 编辑 收藏
算法导论:快速找出无序数组中第k小的数 题目描述: 给定一个无序整数数组,返回这个数组中第k小的数。 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。 阅读详情

相关推荐

CrossOver实战:在Mac上流畅运行《梦幻西游》端游与搬砖指南

在跨平台应用开发与系统兼容性领域,如何让为特定操作系统设计的软件在其他平台上运行,是一个经典的技术挑战。其核心原理在于通过兼容层或转译技术,将程序的系统调用和图形接口指令实时转换为目标系统能理解的格式。这项技术的价值在于极大地扩展了硬件设备的软件生态,让用户无需依赖虚拟机或双系统即可无缝使用关键应用。在游戏、专业工具等场景中,这能显著提升工作效率和用户体验。本文以经典端游《梦幻西游》为例,详细解析如何在搭载Apple Silicon或Intel芯片的Mac上,借助CrossOver这一成熟的兼容层方案,构建

weixin_30129025的博客 573

算法:在两个有序数组中找整体第k小的数

给定两个已经排序的数组(假设按照升序排列),然后找出第K小的数。比如数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110}, 第 3 小的数是 8.。要求时间复杂度O(logN),空间复杂度O(1)。 实现如下: 在上面的程序里,我们是逐一比较数组A 和数组B的值,但是,这样做还是太慢了,因为两个数组是已经排过序的,我们完全可以利用二分查找的方法来解决这样的问题。二分算法的思路是:通过不断的缩小问题的规模,也就是元素的查找范围,来提升算法的执行效率。在具体介绍怎么做之前,先讲一

OceanStar的博客 1556

新手避坑指南:手把手教你从零编写DC综合的.synopsys_dc.setup配置文件

本文详细介绍了如何从零开始编写DC综合的.synopsys_dc.setup配置文件,帮助新手避开常见误区。内容涵盖工艺库路径设置、核心参数详解、实用调试技巧以及高效配置模板,特别强调了配置文件在数字IC设计流程中的重要性。通过实战案例和常见报错解决方案,读者可以快速掌握DC综合配置的关键技能。

weixin_30517215的博客 297

在两个排序数组中找到第k小的数

在两个排序数组中找到第k小的数

十三陵灬的博客 938

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 208

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

本文将介绍在Windows 10系统下搭建深度学习环境的完整过程,包括安装Anaconda、CUDA、NVIDIA显卡驱动以及Pytorch框架。后续本专栏的Python语言下的深度学习环境都以本篇搭建的为准。

fengzhuqiaoqiu的博客 4003

【相当困难】在两个排序数组中找到第K小的数-Java

package live.every.day.ProgrammingDesign.CodingInterviewGuide.Other; /** * 在两个排序数组中找到第K小的数 * * 【题目】 * 给定两个有序数组arr1和arr2,再给定一个整数K,返回所有的数中第K小的数。 * * 【举例】 * arr1=[1,2,3,4,5],arr2=[3,4,5],k=1。 * 1是所有数中第1小的数,所以返回1。 * arr1=[1,2,3],arr2=[3,4,5,6],k=4。

了解➔熟悉➔掌握➔精通 434

Virtuoso集成HspiceD:打通模拟设计全流程的仿真与PEX实战

本文详细介绍了Virtuoso集成HspiceD在模拟设计全流程中的应用,包括仿真与PEX实战。通过无缝衔接Virtuoso和HspiceD,设计师可以在同一环境中完成从原理图设计到PEX后仿真的全流程,大幅提升工作效率。文章还提供了仿真环境配置、前仿真关键设置、PEX全流程详解以及性能调优等实用技巧。

weixin_29271263的博客 98

两个排序数组取第k小的数字

一开始想到的方法是两个指针顺序查找,时间复杂度O(m+n)。后来看了网上的大神做法,用二分查找。 曲线救国。先找到前面k-1个数字,即A[1,2,...p]和B[1,2,...,q]的个数p+q=k-1。由此可见q=k-1-p,使用二分查找找到q即可,时间复杂度为O(lgn)。 二分查找终止条件:B[q] 关键点:由于数组下标是从0开始计算的,因此可以在数组的两头分别加上一个最小

flyHighflyAway的专栏 942

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 504

【最全】ISTQB- FL模拟题(含答案)

汇总收集的所有ISTQB基础级考题和答案

maoxuexue的博客 1万+

python找出最小数_Python算法,以找到未排序数组中k最小数的索引?

在python中,有没有算法可以找到未排序数组中k个最小数的索引?我知道如何使用numpy模块来实现这一点,但我不想找那个。我马上想到的一个方向是排序算法。假设我有一个算法,可以在python中使用bubble sort对数组进行排序:def bubbleSort(arr):n = len(arr)# Traverse through all array elementsfor i in rang...

weixin_34610364的博客 805

下载igv报错:Error loading genome hg38raw.githubusercontent.com...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 993

找出数组中第K大或者是第K小的数(利用快速排序)

快速排序一趟之后,主元pivot到了他最终应该在的位置,如果是从小到大排序,那么一趟排序之后,他左边的数都是比它小的,他右边的数都是比它大的数,所以,如果我们要找出第K小的数,我们可以在一趟排序后,检查主元的位置和K是否对应 if(pos+1 == k),因为下标是从0开始的,所以要加1。如果相等的话,就正好是要找的第K小的数,否则,if(pos+1&gt;k),说明要找的数在主元的左边,我们就...

qq_22080999的博客 9183

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

查找第k小的数

时间限制:1秒 空间限制:65536K 热度指数:4653 算法知识视频讲解题目描述查找一个数组的第K小的数,注意同样大小算一样大。 如  2 1 3 4 5 2 第三小数为3。输入描述:输入有多组数据。 每组输入n,然后输入n个整数(1&lt;=n&lt;=1000),再输入k。输出描述:输出第k小的整数。示例1输入6 2 1 3 5 2 2 3 输出3package test; import ...

菜菜鸟的博客 3896

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

寻找数组中第k大的数

题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回: 2 方法一: 利用冒泡排序,进行k趟排序,即可查找到第k大的数(每趟冒泡排序都寻找当前序列中的最大值) 方法二: 利用选择排序,进行k趟排序,即可查找到第k大的数(每趟选择排序都寻找当前序列中的最大值) 方法三: 利用快速排序的思想,只需找到第k大的数,不必把所.

m0_37671741的博客 7921

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lintcode 在排序数组中找最接近的K个数

lintcode 在排序数组中找最接近的K个数描述样例思路代码 描述 给一个目标数 target, 一个非负整数 k, 一个按照升序排列的数组 A。在A中找与target最接近的k个整数。返回这k个数并按照与target的接近程度从小到大排序,如果接近程度相当,那么小的数排在前面。 k是一个非负整数,并且总是小于已排序数组的长度。 给定数组的长度是正整数, 不会超过 10^4 数组中元素的绝对值不...

qq_40147449的博客 614

第K小的数-分治 快速排序

算法作业记录 题目描述 输入n个数,求其中第k小的数。 输入要求 第一行包含两个整数n和k;n<1000,1<=K<=n 第二行包含n个整数。 输出要求 输出第k小的那个整数。 输入样例 15 1 1 3 7 2 4 6 -1 0 9 88 2 5 17 6 1 输出样例 -1 代码: #include <stdio.h> #include <stdlib.h> int getStandard(int arra[], int i, int j) {

Escape the bug的博客 543

求前K小的数和第K小的数

求前K小的数和第K小的数 1. 前K小的数    (堆排序实现) #include #include #include using namespace std; // 调整堆函数 void HeapAdjust(int *a, int i, int size) // a:数组;i:节点index;size:树的规模 { int lchild = 2 * i + 1; // 节点的

bigfacesafdasgfewgf 1013

532.数组中的k-diff数对

题目描述给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件: 0

ososod的博客 335

每日算法系列【LeetCode 658】找到 K 个最接近的元素

题目描述 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。 示例1 输入: [1,2,3,4,5], k=4, x=3 输出: [1,2,3,...

算法码上来 970

数组中找出2个和为k的数&数组中找出n个和为k的数

思路:借鉴了剑指offer中第34题,使用递归的思想 首先肯定是从下标为0开始,设置一个容器来保存路径,递归有两种方向 选择该点加入队列以及不选择该点加入队列,最后再设置另一个数组来和之前的路径进行比较 相同则不输出 #include <iostream> #include <vector> using namespace std; //1、案例数组 2、所求和 3、加入路径的下标 4、路径数组 5、判断是否重复的数组 void FindPath(vector<int>&

weixin_42060519的博客 935

找到数组中第K大的数

快速排序法中的index就是这个数在数组中的排序,因此用快速排序即可很容易做到 / 找到了index即代表找到了第index大的数,同时将该数放到了这个位置(数组中的index位置)。 挖坑法、前后指针、左右指针子程序都不变。将分治法改一下即可 def quickArray(ary,left,right): if left&lt;right: k=ary[right...

fanzy1234的博客 704

寻找无序数组中第k大的数

对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的数。排序算法的时间复杂度为O(nlogn),所以算法总的时间复杂度为O(nlogn)。// Simple C++ program to find k'th biggest element #include<iostream> #include<algorith

好记性不如烂笔头 1万+

九章算法 | Google面试题:在排序数组中找最接近的K个数

给一个目标数 ​target​, 一个非负整数 ​k​, 一个按照升序排列的数组 ​A​。在​A​中找与​target​最接近的​k​个整数。返回这​k​个数并按照与​target​的接近程度从小到大排序,如果接近程度相当,那么小的数排在前面。​k​是一个非负整数,并且总是小于已排序数组的长度。给定数组的长度是正整数, 不会超过 10​^4​​数组中元素的绝对值不会超过 10​^4在线评测地址:L...

九章算法的博客 288
上一篇: 算法总结之 在两个长度相等的排序数组中找到上中位数
下一篇: 数组和矩阵问题
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值