第三章:查找与排序(下)----------- 3.12 实践_最小可用id是多少

算法新解前言:最小可用id求解 算法新解前言:最小可用id求解 前言 这是我第一次在csdn上写博客,主要是打算记录一下自己学习算法的一些过程。 遥想大一当年学姐建议我去学习一下算法,时光匆匆,四年转眼即逝,已经研一了,发现这四年确实走了不少弯路。最近发生了几件事,让我萌生了写算法博客的想法。 一是这学期有一门算法课,汤老师虽然讲得很快,不过思路确实讲得好,但是光听课不实践,学习效果就会差很多; 二是有一个学弟学习算法遇到了瓶颈... 阅读详情

最小可用ID:在非负数组(乱序)中找到最小可分配的id(从1开始编号),数据量为1000000。

解法1:

暴力解法:O(N²)。从1开始依次探测每个自然数是否在数组中。不推荐

解法2:

先排序,然后看哪个数“不在其位”。NlgN。

#include<iostream>
#include<algorithm>
using namespace std;

int find2(int arr[],int length){
	sort(arr,arr+length);
	int i=0;
	while(i<length){
		if((i+1)!=arr[i]){
			return i+1;
		}
		i++;
	}
	return i+1;
} 

int main(){
	int arr[]={3,6,1,5,9,7,8};
	int len=7;
	cout<<find2(arr,len);
	
	return 0;
}

结果:

解法3:

开辟辅助空间,Eg:若5出现,则标记辅助空间5号单元为1。

待求数组,长度为n,最小可用ID不可能大于n+1。即 最小可用id<=n+1.

 

//伪代码: 
helper=[A.length]
for(i 0...A.length-1){
	helper[A[i]-1]=1;
}
for(i 0...A.length-1){
	if(helper[i]==0)
		return i+1;
}
return A.length+1

 

#include<iostream>
#include<algorithm>
using namespace std;

/* 
改进1:
新建长为n+1的数组F,初始值全为false,扫描原数组中的元素,小于n则将F[A[i]]记录为true
最后再扫描F,返回第一个为false的元素的下标,注:有点类似于计数排序O(n)但是浪费空间
*/
int find3(int arr[],int length){
	int n=length;
	int helper[n+1]; 
	
	//*helper数组初始化 
	for(int i=1;i<n+1;i++){
		helper[i]=0;
	}
	
	for(int i=0;i<n;i++){
		if(arr[i]<n+1){
			helper[arr[i]]=1;  //1:代表出现;0:代表未出现 
		}
	}
	for(int i=1;i<=n;i++){
		if(helper[i]==0){
			return i;
		}
	}
	return n+1;
} 

int main(){
	int arr[]={3,6,1,5,9,7,8};
	int arr2[]={1,2,3,4,5,6,7};
	int len=7;
	cout<<find3(arr,len)<<endl;
	cout<<find3(arr2,len);
	return 0;
}

结果:

解法4:

分区,递归 :
问题可转化为:n个正数的数组A,如果存在小于n的数不在数组中,必然存在大于n的数在数组中,否则数组排列恰好为1到n

举例判断边界(结束条件):

 

#include<iostream>
#include<algorithm>
using namespace std;

int selectK(int A[],int p,int r,int k);

/* 
改进2:分区,递归 
问题可转化为:n个正数的数组A,如果存在小于n的数不在数组中,必然存在大于n的数在数组中,否则数组排列恰好为1到n
*/
int find4(int arr[],int l,int r){
	if(l>r){
		return l+1;
	}
	
	int midIndex=l+((r-l)>>1);//中间下标
	int q=selectK(arr,l,r,midIndex-l+1);//实际在中间位置的值
	int t=midIndex+1;//期望值
	
	if(q==t){//左侧紧密 
		return find4(arr,midIndex+1,r);
	} 
	else{//左侧稀疏 
		return find4(arr,l,midIndex-1);
	}
	 
} 

int main(){
	int arr[]={3,6,1,5,9,7,8};
	int len=7;
	
	cout<<find4(arr,0,6);
	return 0;
}

 
//三点中值法 
int partition(int A[],int p,int r){
	
	//优化: 在p、r、mid之间,选一个中间值作为主元
	int midIndex=p+((r-p)>>1); //中间下标
	int midValueIndex=-1; //中值的下标
	if(A[p]<=A[midIndex]&&A[p]>=A[r]){
		midValueIndex=p;
	} 
	else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
		midValueIndex=r;
	} 
	 else{
	 	midValueIndex=midIndex;
	 }
	swap(A[p],A[midValueIndex]);
	int pivot=A[p];
	
	int left=p+1;//扫描指针 
	int right=r; //右侧指针 
 
	
	while(left<=right){
		//left不停往右走,直到遇到大于主元的元素
		while(A[left]<=pivot) left++;   //循环退出时,left一定是指向第一个大于主元的位置 
		while(A[right]>pivot) right--;   //循环退出时,right一定是指向最后一个小于等于主元的位置 
		if(left<right){
			swap(A[right],A[left]);	
		}			
	} 
	//while退出时,两者交错,且right指向的是最后一个小于等于主元的位置,也就是主元应该待的位置 
	swap(A[p],A[right]);
	
	return right;		//返回主元在交换完成后的下标
}
 
int selectK(int A[],int p,int r,int k){
	int q=partition(A,p,r); //主元下标 
	int qK=q-p+1; //主元是第几个元素(排好序后) 
	if(qK==k){
		return A[q];
	} 
	else if(qK>k){
		return selectK(A,p,q-1,k);
	}
	else{
		return selectK(A,q+1,r,k-qK);
	}
}

 结果:

Elasticsearch 根据 _id 排序 我这里有一个测试索引数据如下: 如果用普通的排序方法对_id中的数据进行排序的话: GET _search { "query": { "term": { "_index": "test" } }, "sort": { "_id": { "order": "asc" } }, "size": 20 } 因为_id的数据为字符串类型,因此排序出来的结果其实并不是我们想要的: { "took" : 5, "timed_out" 阅读详情

相关推荐

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3721

最小可用ID(4种方法,详细讲解)

三、最小可用ID:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000

gl620321的博客 1797

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6119

题4:最小可用ID

题目: 在非负数组(乱序)中找到最小可分配的id(从1开始编号),数据量1000000 思路: 第一种方法:暴力解法 时间复杂度O(n²) 从1开始探测每个自然数是否在数组中 第二种方法:先排序,再找第一个缺失数 时间复杂度O(NlgN) 第三种方法:开辟一个辅助空间 改进1 先建一个长度为n+1的数组helper,初始值全为0或false,扫描原数组中的数,小于n则将helper[a[i]]置为1或true 最后再扫描数组helper,返回值为0或false的小标 package 分

m0_66279156的博客 206

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 679

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助!

四楼没电梯的专栏 3646

最小可用id(个人分析)

题目:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量10000000。 题目解读:在一个不重复的乱序的自然数组中找到最小的缺失的那个数,比如1,2,3,6,4,5,8,11。那么最小可用id就为7。 个人总结有三个方法来进行解答,但是算法性能不一样: 第一种,暴力解决,设置一个变量,依次遍历数组中每个元素,如果哪个元素没有直接return public static ...

不要脸的阿智的博客 658

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 518

一题三解|最小可用ID

最小可用ID 描述 在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000。 例如(3,2,1,5,8,6)中,最小可用ID为4。 解法1 将乱序数组排序之后,对数组中的数字进行位置确认。即第x个数字要在x - 1的索引上。复杂度O(nlgn) private static int f(int[] arr) { Arrays.sort(arr); int res ...

My Blog 565

深入解析反射式DLL注入:从原理到实战优化

本文深入解析反射式DLL注入技术,从原理到实战优化全面剖析。通过PE文件内存重构、反射加载器实现及免杀增强方案,展示如何绕过安全检测并提升性能。适用于红队行动、内网渗透等场景,是高级攻防对抗中的关键技术。

weixin_28339967的博客 405

Unity零基础到入门 ☀️| 轻松学会 Unity界面布局和简单实例——入门级!(^_−)☆

入门级Unity知识,一起加油呀!

努力前行,总会成为自己心中的那道光 1万+

三、排序_05 &数组中的最小可用ID(笔记)

public class A011_数组中的最小可用id { public static void main(String[] args) { int[] arr = { 3, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16 }; check(arr, 0, arr.length - 1); } public static void check(int...

oQQSanGuo的博客 178

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最小可用ID

题目:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000。 方法一:把值装到桶里最后看看那个桶里没有元素 import java.util.*; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { static int[] mergeArr; public static void main(String[] args) { Scanner input = new Scann

qq_61185410的博客 414

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SQLite3 获取最小可用ID,ID无需包含1

SQLite3 获取最小可用ID,自定义范围一、语法二、解析1. 判断最小ID是否为12. 判断最小ID递增后是否存在3. 范围限定三、总结 一、语法 获取1 到 500 范围间的最小可用ID : select CASE WHEN (select 1 from mytable where exists(select myID from mytable where myID=1)) THEN min(myID)+1 ELSE min(0)+1 END from mytable t where not e

小小的进步 812

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[机试]第三章 排序与查找

例题3.1 排序 KY210 排序 #define _CRT_SECURE_NO_DEPRECATE #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 110; int arr[MAXN]; int main() { int n; while (scanf("%d", &n) != EOF) { for (i

“知识最大的敌人不是无知,而是错觉” 440

数据结构实验报告:查找和排序的应用

                                   学生信息管理系统 一、实验目的 1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。 2、学会比较各种排序与查找算法的优劣。 3、学会针对所给问题选用最适合的算法。 4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。 二、实验内容 [问题描述]  学生信息管理系统 [基本要求] 设计一个...

2码8改 1万+

C语言排序与查找实例

1、顺序查找 学号 姓名 成绩 1001 ANN 93 1002 LILY 95 1003 LUCY 98 1004 TOM 100 编写一上程序,要求输出1001编号同学的具体信息   #include "stdio.h" typedef struct student{ int id;//学

myserverthepeople的专栏 2746

分布式全局唯一 ID 生成方案:性能、有序性与高可用的工程三重门

分布式唯一 ID 生成是一个"简单问题复杂化"的经典案例。不是因为实现有多难,而是每一重约束都会压缩方案的选择空间。先明确是否需要趋势递增——这是方案选择的分水岭Snowflake 的方案依赖时钟准确性,部署前必须设计时钟回拨处理策略号段模式吞吐量最高,但需接受 ID 空洞的存在双 Buffer 预加载是可选的性能优化,不是必需的复杂度无论选择哪种方案,ID 格式中预留 2-3 位扩展位,为未来迁移留空间。

qq_35160742的博客 4754

Moderate 找最小排序区间 @CareerCup

例子:数组 1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19  只要对下标3到9之间的元素排序,就能使整个数组有序 思路是: // Left: 1, 2, 4, 7, 10, 11 // Middle: 7, 12 // Right: 6, 7, 16, 18, 19 1 找到左边递增序列的最右(最大)的那个元素 11 2 找到右边递增序列最左(最

1593

算法学习:在非负数组中寻找最小可分配 ID

在编程的世界里,算法是解决问题的核心。今天,我们就来探讨一道有趣的算法题:在非负数组中找到最小可分配的 ID。这个 ID 从 1 开始编号,数组中的数可以随意排列,数据量可能达到 100 万。

m0_57836225的博客 404

MySQL ID排序 varchar排序问题

由于id的字段类型为varchar类型,导致在根据id排序时出现问题 下面是我在MySQL数据库中以uniqueid排序,排序后的结果如下: MariaDB [da]> select uniqueid,username from user order by uniqueid limit 15; +----------+----------+ | uniqueid | username...

weixin_41295682的博客 933

NumPy 排序、查找、计数

章节Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切片 NumPy 广播 NumPy 数组迭代 NumPy 位运算 NumPy 字符串函数 NumPy 数学函数 NumPy 统计函数 NumPy 排序、查找、计数 NumPy 副本和视图 NumPy 矩...

吴吃辣 1万+

Flutter for OpenHarmony:Flutter 三方库 objectid — 离线分布式高可用 ID 引擎

摘要: 开源鸿蒙跨平台社区推荐使用ObjectId作为离线系统的分布式主键方案,解决传统自增ID导致的同步冲突问题。ObjectId通过12字节紧凑存储时间戳(4字节)、设备标识(5字节)和自增序列(3字节),实现高并发下的零冲突保障,同时支持无损提取创建时间。文章详细解析其原理、API使用方法及OpenHarmony适配注意事项,强调禁止人为修改ID结构以保持防碰撞特性,并提供了Dart/Flutter代码示例展示批量生成、时间戳提取等核心功能,适用于离线多端协同等复杂场景。 (字数:149)

lady_mumu的博客 4190

12种排序算法详解

作者:寒小阳 时间:2013年9月。 出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251。 声明:版权所有,转载请注明出处,谢谢。 0、前言      从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算

u014682691的专栏 3万+

id卡卡号是多少位_分布式id

"Sometimes the questions are complicated and the answers are simple.—— Dr.Seuss"当产品使用人数达到一定量级,一般会采用分库分表等优化操作,但是分布式id如何保证全局唯一呢?更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』1.UUIDUUID全称是Universally Uniqu...

weixin_39758229的博客 2075
上一篇: 第三章:查找与排序(下)----------- 3.11 趣味拓展_寻找发帖水王
下一篇: 第三章:查找与排序(下)----------- 3.14 逆序对个数
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值