当前位置: 首页 > article >正文

升序数组两两不相等

题目:给定一个排好升序的数组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)。


http://www.kler.cn/a/376480.html

相关文章:

  • LeetCode 3226.使两个整数相等的位更改次数:位运算(接近O(1)的做法)
  • 【python】OpenCV—Tracking(10.4)—Centroid
  • HTML 多媒体标签详解:<img>、<object> 与 <embed>
  • PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
  • HarmonyOS:UIAbility组件概述
  • 探索 ONLYOFFICE:开源办公套件的魅力
  • C语言稀有关键词:柔性数组
  • 【创建型】单例模式
  • Hypack 应用于地形测量的高级设置操作要领
  • Nginx 的 Http 模块介绍(上)
  • Git - 两种方式撤销已提交到远端仓库的记录并删除提交记录
  • vite 创建了一个项目后,如何实现工程化
  • 【赵渝强老师】Memcached集群的架构
  • 数据结构,问题 G: 字符串匹配问题
  • Spring Boot接收参数的19种方式
  • DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析
  • Vite常用插件配置
  • R学习笔记-单因素重复测量方差分析
  • 032_Tiledlayout_in_Matlab中的分块图布局
  • C++/Opengl编程实践
  • 代码随想录一刷——350.两个数组的交集II
  • 024集——CAD 动态显示图形——ed.Redraw(ent)实现(CAD—C#二次开发入门)
  • 初探Flink的序列化
  • centos7 zabbix监控nginx的pv和uv和status_code
  • 无法启动此程序win10玩游戏找不到d3dx9_43.dll缺失的五种常用有效解决方法
  • el-table 修改高亮行样式