升序数组两两不相等

题目:给定一个排好升序的数组A[1],A[2],… A[n],其元素的值两两都不相等。请设计一个高效算法,找出其中所有A[]=i的下标,并分析其复杂度。

算法分析:一个升序且值都不相等的数组,如果第一个数大于右下标(数组最后一个数的下标),或最后一个数小于左下标,则这个数组里一定没有满足题意的数。

  • 对于int型数组,可以使用二分法,如果a[mid]>mid+1,由于数组为整型且递增,没有相同的元素,因此右半段一定都不符合题意,因此只需要在左边继续查找。a[mid]<mid+1时同理,只需要在右半段查找。而a[mid]==mid+1时,左右两边都有可能有答案,因此还需要在左右两边继续查找。
  • 对于浮点型数组,无论a[mid]和mid+1的关系如何,都无法缩小查找范围,左边和右边都有可能存在答案。所以考虑a[mid]和边界的关系:如果a[mid]<left+1或a[left]>mid+1,显然答案就在右半段;如果a[mid]>right+1或a[right]<mid+1,答案就在左半段。否则,两边都有可能。

算法实现:

#include<iostream>
using namespace std;
const int n=5;

//void find(int a[n],int left,int right){
//	if(left>right) return;
//	if(a[left]>right+1||a[right]<left+1) return;//数组第一个数大于右下标,最后一个数小于左下标,显然无解。加1是因为题目中数组下标从1开始  
//	int mid=(right+left)>>1;
//	if(a[mid]==mid+1){
//		cout<<a[mid]<<" ";
//		find(a,left,mid-1);
//		find(a,mid+1,right);
//	}else if(a[mid]>mid+1){//如果 a[mid]>mid+1,只有左半边有可能 
//		find(a,left,mid-1);
//	}else{//如果 a[mid]<mid+1,只有右半边有可能 
//		find(a,mid+1,right);
//	}
//}

void find2(double a[n],int left,int right){
	if(left>right) return;
	if(a[left]>right+1||a[right]<left+1) return;//数组第一个数大于右下标,最后一个数小于左下标,显然无解。加1是因为题目中数组下标从1开始  
	int mid=(left+right)>>1;
	if(a[mid]<left+1||a[left]>mid+1){//答案在右半段 
		find2(a,mid+1,right);
	}else if(a[mid]>right+1||a[right]<mid+1){//答案在左半段 
		find2(a,left,mid-1);
	}else if(a[mid]==mid+1){
		cout<<mid+1<<" ";
		find2(a,mid+1,right);
		find2(a,left,mid-1);
	}else{
		find2(a,mid+1,right);
		find2(a,left,mid-1);
	} 
}

int main(){
//	int a[n]={1,2,3,4,5};
//	find(a,0,n-1);
	double a[n]={1.1,2,3.1,4,5};
	find2(a,0,n-1);
	return 0;
}

对于int型数组:

复杂度分析:最坏时间复杂度为O(n):可能每次a[mid]都等于mid+1,此时需要遍历整个数组;平均时间复杂度为O(logn):平均情况下,T(n)=T(n/2)+O(1);空间复杂度为O(logn):递归调用的深度为logn。

对于浮点型数组:

复杂度分析:最坏时间复杂度为O(n),平均时间复杂度为O(n);空间复杂度为O(logn)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于vue框架的的乐守护儿童成长记录系统b65tg(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,成长指标,疫苗接种,学业档案,课外活动,旅游经历,交流论坛 开题报告内容 基于Vue框架的乐守护儿童成长记录系统开题报告 一、研究背景与意义 随着科技的飞速发展和家庭对子女成长关注度的不断提升&#xff0c;如何科学、系统地记…

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

使用Git LFS管理大型文件

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Git LFS管理大型文件 引言 Git LFS 简介 安装 Git LFS 安装 Git 安装 Git LFS 配置 Git LFS 初始化 Git 仓库 指定需要使用…

RHCE的练习(10)

实验1&#xff1a;反向解析 准备工作 [rootserver ~]# setenforce 0[rootserver ~]# systemctl stop firewalld# 服务端安装bind软件 [rootserver ~]# dnf install bind -y DNS配置 第一步&#xff1a;服务端操作&#xff0c;编辑bind主配置文件 [rootbogon ~]# cat /e…

Redis-结构化value对象的类型

文章目录 一、Redis的结构化value对象类型的介绍二、Redis的这些结构化value对象类型的通用操作查看指定key的数据类型查看所有的key判断指定key是否存在为已存在的key进行重命名为指定key设置存活时间pexpire与expire 查看指定Key的存活时间为指定key设置成永久存活 三、Redis…

产品结构设计(六):结构设计全过程

参考引用 产品结构设计实例教程 1. ID 图及 PCB 堆叠分析 1.1 产品说明及相关资料 1、新产品开发指令单 2、ID 图 3、产品功能规格书 1.2 ID 图分析 ID&#xff08;Industrial Design&#xff0c;工业设计&#xff09;是以工业产品为主要对象&#xff0c;综合运用工学、…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

webGlL变量的声明与使用

抢先观看&#xff1a; 变量的声明格式&#xff1a;<存储限定符><类型限定符><变量名> 存储限定符&#xff1a;const, attribute, uniform, varying, buffer。 类型限定符&#xff1a;void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…

免费送源码:Java+CSS+springboot Springboot高校医务室管理系统 计算机毕业设计原创定制

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

CDN加速实战:使用七牛云CDN加速阿里云OSS资源访问

今天是双11搞活动,在阿里云1元注册了个域名,想着在学CDN,想使用CDN做个加速项目,但是阿里的要收费,上网查了下七牛云的不收费,想着将七牛云的CDN结合阿里的DNS做个访问加速,刚好看到了阿里的一个文章,照着改了改,实践成功了。 阿里文章:使用CDN加速OSS资源访问_对象…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

笔记本电脑买i7还是i9?i7和i9处理器区别详细介绍

i7和i9处理器都是英特尔&#xff08;Intel&#xff09;公司生产的高性能处理器&#xff0c;但它们有一些显著的区别。为了帮助你做出明智的选择&#xff0c;下面我们详细介绍一下i7和i9处理器的区别&#xff0c;以及如何根据你的需求来选择合适的处理器。 一、i7处理器的特点…

51c大模型~合集12

我自己的原文哦~ https://blog.51cto.com/whaosoft/11564858 #ProCo 无限contrastive pairs的长尾对比学习 , 个人主页&#xff1a;https://andy-du20.github.io 本文介绍清华大学的一篇关于长尾视觉识别的论文: Probabilistic Contrastive Learning for Long-Tailed Visua…

【数据结构篇】探索堆的算法的巧妙

须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1f;别忘了点…

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…

如何使用VBA识别Excel中的“单元格中的图片”(2/2)

Excel 365升级了新功能&#xff0c;支持两种不同的插入图片方式&#xff1a; 放置在单元格中&#xff08;Place in cell&#xff09;&#xff0c;新功能&#xff0c;此操作插入的图片下文中简称为单元格中的图片。放置在单元格上&#xff08;Place over cell&#xff09;&…

Nature|用于无线监测颅内信号的植入式柔性超声波传感器(柔性传感/健康监测/植入式电子/水凝胶)

华中科技大学臧剑锋(Jianfeng Zang)、华中科技大学同济医学院附属协和医院姜晓兵(Xiaobing Jiang)和新加坡南洋理工大学陈晓东(Xiaodong Chen)团队,在《Nature》上发布了一篇题为“Injectable ultrasonic sensor for wireless monitoring of intracranial signals”的论…

FlaskFastAPIgunicornunicorn并发调用

Flask VS. FastAPI Flask和FastAPI是Python中两种流行的Web框架&#xff0c;它们各自具有不同的特点和适用场景。以下是它们之间的一些主要区别&#xff1a; 1. 框架类型 Flask&#xff1a;Flask是一个轻量级的微框架&#xff0c;适合构建小型到中型的Web应用。它灵活且易于扩展…

像`npm i`作为`npm install`的简写一样,使用`pdm i`作为`pdm install`的简写

只需安装插件pdm-plugin-i即可&#xff1a; pdm plugin add pdm-plugin-i 然后就可以愉快地pdm i了&#xff0c;例如&#xff1a; git clone https://github.com/waketzheng/fast-dev-cli cd fast-dev-cli python -m pip install --user pipx pipx install pdm pdm plugin a…

C#笔记——委托(2)

Unity定义好的委托 在Unity里使用委托时&#xff0c;除了上章讲的自定我委托&#xff0c;还可以使用Unity定义好的委托 Action 无参无返回值委托 Func<T> 泛型委托 返回指定类型 Action<T1, T2> 可以传多个参数的有参委托 无返回值 Func<T1, T2> 可…