找到N个无序数中第M大的数

算法学习:合并N个有序数组,每个数组的长度为M,时间复杂度要求最低 题目:合并N个有序数组,每个数组的长度为M,合并为N*M的有序数组。时间复杂度要求最低 解法:N个数组进行两两合并,合并后的数组再继续执行合并过程,最后合成N*M的有序数组。可以认为合并这个递归过程发生了logN次,每一次合并的过程都是N*M个数合并,所以每一次合并的时间复杂度为N*M,总的时间复杂度就是N*M*logN 代码如下: public class MergeArrays { public static void main(String[] args) { .. 阅读详情

题目:在一组无序数中找到第M大的数,如一组无序数中:3,2,321 中,找到第2大的数,显然这里可以明显的看出是数字3。

解析:这种类型的题有很多种解法,最简单的做法无非是先整体排完序之后直接找第M个数,这种的效率明显是很低的。我这里使用快速排序的思想来解这道题,首先在无序数中随便找一个数作为中间值(我这里用的是第一个数),然后将比中间值大的数移动到中间值左边,比中间值大的数移动到中间值右边,分完之后会出现这样的情况:

1.当左边区间的个数大于等于M时(第M大),则递归该区间

2.当左边的区间小于M且与M相差1时,则输出中间值

3.以上两种情况都不符合时,递归右边区间,找到右边区间第 { M-1-(左边区间个数)}大的数


java代码:

public class FindNumber {
	//找到N个无序数中的第M大的数
	public static void main(String[] args) {
		int[] so=new int[]{3,2,321,654,65,45,234,233,432,6234};
		int m=new FindNumber().find(so, 8, 0,so.length-1);
		System.out.println(m);
	}
	public int find(int[] so,int m,int start,int end){
		if(start<end){
			int midValue=so[start]; //第一个元素作为中间值
			int i=start;
			int j=end+1;
			while(true){//这个while循环将小于中间值的分到左边,大于中间值的分到右边
				while(i<end&&so[++i]<=midValue);
				while(j>start&&so[--j]>=midValue);
				if(i<j){ 
					//i,j下标对应的值交换
					swap(so,i,j);
				}else{
					break;
				}
			}
			swap(so,start,j);
			//左半部分的个数
			int p=j-1-start<0?1:(j-start);
			if(p>=m){
				return find(so,m,start,j-1);
			}else if(p+1==m){
				return so[j];
			} else{
				return find(so,m-1-p,j+1,end);
			}
		}else{
			return so[start];
		}
	}
	//交换
	public void swap(int[] so,int i,int j){
		int t=so[i];
		so[i]=so[j];
		so[j]=t;
	}
}



CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南) 本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。 阅读详情

相关推荐

从波士顿动力SpotMini拆解看四足机器人机械设计:关节布局与电机选型的5个关键决策点

本文深入解析波士顿动力SpotMini四足机器人的机械设计,聚焦关节布局与电机选型的5个关键决策点。通过拆解髋关节偏移距、膝关节传动链、电机热管理等核心设计,揭示商业级四足机器人的工程智慧,为工业巡检、物流机器人等应用提供实用参考。

postgres8guard的博客 893

N个数(其中数可重复),求出其中第m大的数。

题目:N个数(其中数可重复),求出其中第m大的数。 #include<stdio.h> int Maxm(int *number,int m) { if(number==NULL) return 0; int length=5; int i=0; for(i;i<length;i++) { int j=0; for(j;j<length-i-1;j...

ShawnWang1994的博客 1560

IEEE Transactions模板中参考文献作者缩写、期刊名缩写

本文章记录如何在IEEE Transactions的模板中,解决参考文献的作者缩写、期刊名字缩写的问题。

weixin_43981621的博客 1万+

从n个无序的数中选出m个最大数

从n个无序的数中选出m个最大数

竭尽全力的专栏 7794

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 673

计算机组成原理(二)—— 数据的表示与运算

本章目录引言一、数制与编码1.1 进位计数制1.1.1 进制及转换1.1.2 真值、机器数1.2 BCD码1.3 ASCII 码1.4 校验码1.4.1 奇偶校验码1.4.2 海明码1.4.3 CRC循环冗余码二、定点数的表示和运算2.1 定点数的表示2.1.1 无符号2.1.2 有符号(原码、反码、补码、移码)2.2 定点数的运算2.2.1 移位运算2.2.2 加减运算(溢出判断)2.2.3 乘法运算2.2.4 除法运算2.3 强制类型转换2.4 数据的存储和排列三、浮点数的表示和运算3.1 浮点数的表示

S mile0804的博客 7473

找一个无序数组第m大的数的算法

在一个个数为n的无序数组中找第m大的数,基本思想无非还是排序的思想,只不过需要我们稍微对现有的排序算法做些改动。 首先最简单的冒泡,插入排序,我们可以先直接排序,然后遍历到第m大的数,这个复杂度应该就是O(n^2),稍微想一下,我们好像还可以只维护一个大小为m的数组用来存储前m大的数,这样复杂度就降低了一些,变成了O(n*m)。关于冒泡,插入,至今我只想出这两个算法,如有其他好的算法欢迎分享。

KrossJin的专栏 1903

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码)

本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。

pp12345的博客 429

从长度为M的无序数组中找出N个最大的数

1、将数组前N个数调整成最小堆 2、堆顶元素值依次与第N个元素以后的每个元素进行比较 3、若堆顶元素值小,则将堆顶元素重新赋值为新元素的值,并且将前N个数重新调整为最小堆;否则判断下一个元素 4、直到遍历完原数组的最后一个元素后,则最小堆中的元素即为待求的数组中的N个最大的数 复杂度为O(M*log(N)) python代码: # -*- coding: utf-8 -

mashuangwe的博客 5225

SPEI计算避坑指南:gma中Distribution和FitMethod参数怎么选?

本文深入探讨了在SPEI计算中如何科学选择gma库中的Distribution和FitMethod参数,帮助研究者避开常见陷阱。详细分析了LogLogistic、Gamma和Pearson3三种分布的适用场景,以及LMoment与MLE拟合方法的优缺点,为气象干旱研究提供实用指南。

weixin_30308101的博客 250

【异常】飞书OpenClaw机器人 HTTP 401: Invalid Authentication 报错排查与解决方案

HTTP 401 是HTTP协议标准定义的未授权(Unauthorized)状态码,核心含义为请求方身份认证无效,服务端拒绝执行本次请求。飞书开放平台服务端对自建机器人的全链路鉴权校验失败。无论是机器人接收飞书事件推送的上行请求,还是机器人主动调用飞书开放平台API的下行请求,只要身份凭证无效、鉴权逻辑校验不通过,飞书服务端就会返回该报错,并最终透传到飞书客户端会话窗口中。

奶爸的编程之路,也就一周冷个三天 3759

在不等长的两个正序数组中找第k大的数

在不等长的两个正序数组中找第k大的数,时间复杂度O(log(min{n,m})),详细带图讲解算法思想

m0_52765511的博客 325

22、硬件工程师笔试面试——电机(2025版本)

例如,B级绝缘的电机可以承受的最高温度为130℃,而H级绝缘的电机可以承受高达180℃的温度。同时,也要考虑电机的成本和控制系统的复杂性。电机的选择取决于其应用的具体要求,包括所需的功率、速度、扭矩、效率、成本和工作环境等。根据电动机保护配置原则,为电机配置适当的保护,如过负荷保护、缺相保护、逆相保护、接地漏电保护、堵转保护、相不平衡保护、短路保护、过电压保护、低电压保护、过热保护等。根据安培环路定理,电流和磁场的相互作用会在电机的转子上产生力,这些力作用于转子上,使其绕轴旋转,从而产生转矩。

XU157303764的博客 3538

两个有序数组的中位数c语言,两个有序数组的第K大的数,看不会包打!

要求时间复杂度是O(log(m+n)),一看时间复杂度是log,那肯定是采用了二分(分治)的方法才能达到log的效果~~~废话不多说,直接开干,顺带说一下,c语言是世界上最好的语言~~~~~~设有如下两个有序数组:a[3] = {1,2,3};b[6] = {2,3,4,5,6,7}以下分析步骤求第k大的数,我们设这k个数,包含在数组a中的有p个,包含b中的有q个,则有p+q=k; a数组的起始索...

weixin_30799553的博客 165

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

寻找两个正序数组的中位数

题目: 给定两个大小为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的中位数。 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗? 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位...

弗洛伊德式兔窝 126

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

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

【icyle】Leetcode-cn:4. 寻找两个正序数组的中位数

注:此题为Hard,难度较高,目前参考Leetcode官方解答思路,地址:官方解答 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗? 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4

icy的代码小屋 200

求一无序数组中第n大的数字 - 快速选择算法

逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下。 最朴素的解法就是先对数组进行排序,返回第n个数即可。。 下面代码中用的是快速选择算法(不晓得这名字对不对) 1 #include <vector> 2 #include <iostream> 3 #include <stdexcept> 4 #include ...

weixin_30760895的博客 426

4. 寻找两个正序数组的中位数【困难】【商汤、字节 真题】 & 两个有序数组找第k大

一、题目描述 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1nums1nums1 和 nums2nums2nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m+n))O(log(m + n))O(log(m+n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)

weixin_41888257的博客 1137

20-输出前m大的数

例题:输出前m大的数 题目描述 给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出。 输入 第一行包含一个整数n,表示数组的大小。n &amp;amp;lt; 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。第三行包含一个整数m。m &amp;amp;lt; n。 输出 从大到小输出前m大的数,每个数一行。 题目分析 思路:用分治处理,把前m大...

桑凯旋的博客 856

两个有序数组 求第k小的数O(log(min(M,N))

【题】两个有序数组 求第k小的数O(log(min(M,N)) 【思路】借助求解上中位数的思想 对k和数组长度分类讨论 划分出两个长度相同的部分 以求解最后第k小的数 【具体例子分析】 【代码】 //求解上中位数算法 int FindProcess(vector<int>arr1, int start1, int end1, vector<int>arr2, in...

RyanXTY的博客 1246

分治---输出前m大的数

分治 swap()函数

CourserLi的博客 393

两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回

/*************************************************************************** **description:两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回 ** 要求总的时间复杂度为O(log(m+n)) ***************************************

yoomiky的博客 3592

从n个无序数中找出第K大的数

遇到题目为从n个无序数组中找出第K大的数,最开始想到的就是冒泡排序、选择排序等,每次找到一个最大(或最小)的,但是很明显需要时间复杂度为O(n*k)!具体代码细节参考findK_2 改进一点的算法有根据快速排序的思想,时间复杂度达到O(n)。想象一下,第k大,说明前面有k-1个元素是比第k个元素大,那么利用快速排序的思想,将大于轴值(暂且固定第一个元素)的放在左边,小于轴值的放在右边...

blbq105的博客 1460

从2个有序数组中找第k小那个数

两个升序数组,寻找融合之后升序数组中第k小的那个数。

weixin_46838716的博客 1916

poj 2893 M × N Puzzle n*m数码问题 (求逆序数)

原题:http://poj.org/problem?id=2893 题解: n*m的数码问题有一个结论: 1.假如m是奇数,那么上下交换会改变(m-1)也就是偶数次逆序数,左右交换(空格和左右交换)不改变逆序数,因此逆序数的奇偶性不变,此时两状态的奇偶性一致即有解 2.假如m是偶数,上下交换会改变奇数次逆序数,左右交换不改变逆序数,因此逆序数奇偶性会因上下交换而改变,此时逆序数之差和两个局...

forOnward的博客 356

一个有序数组,找到两个数使得它们相加之和等于目标数

一个有序数组,找到两个数使得它们相加之和等于目标数 原题: 一个有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)从1开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 此题作者已知有三种解决方法: 方法一:暴力解法...

qq_21031977的博客 3762
上一篇: 泊松分酒
下一篇: 翻手算法
KeepThinking_
博客等级 码龄15年 50粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值