剑指offer——在排序数组中查找数字

本文探讨了在排序数组中查找特定元素的高效算法,包括数字出现次数、缺失数字及数值等于下标的元素。通过二分查找优化了查找速度,详细解析了每种情况的解题思路。

题目一:数字在排序数组中出现的次数

 统计一个数字在排序数组中出现的次数。

 

解题思路:

 

方法一:

直接遍历一遍,O(n)的时间复杂度。

 

方法二:二分查找,时间复杂度度更优

分别二分查找第一个k的位置和最后一个k的位置

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.size()==0) return 0;
        int FirstKIndex=-1;//第一K的下标
        int LastKIndex=-1;//组后一个K的下标
        int low=0,high=data.size()-1;
        //二分查找找第一个K的下标
        while(low<=high){
            int mid=(low+high)/2;
            if(data[mid]==k){
                if((mid>0&&data[mid-1]!=k)||mid==0) {
                    FirstKIndex=mid;
                    break;
                }else {
                    high=mid-1;
                }
            }else if(data[mid]>k){
                high=mid-1;
            }else{
                low=mid+1;
            }
        }
        //二分查找找最后一个K的下标
        low=0;
        high=data.size()-1;
        while(low<=high){
            int mid=(low+high)/2;
            if(data[mid]==k){
                if((mid<data.size()-1&&data[mid+1]!=k)||mid==data.size()-1) {
                    LastKIndex=mid;
                    break;
                }else{
                    low=mid+1;
                }
            }else if(data[mid]>k){
                high=mid-1;
            }else{
                low=mid+1;
            }
        }
        int res=0;
        //如果数组中有K
        if(FirstKIndex>=0) res=LastKIndex-FirstKIndex+1;
        return res;
    }

 

题目二:0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

 

解题思路:

二分查找第一个值和下标不相等的元素。有一点要注意的是如果查找到最后一个元素还是未找到缺失的元素(也就是还未找到值和下标不相等的元素)说明缺失的是最后一个元素。

 

如果中间元素的值和下标相等:

  • 下一轮查找只需要从中间元素的右边查找。

如果中间元素的值与下标不相等:

  • 如果中间元素的前一个元素值与下标相等,这时的中间元素就是第一个值和下标不相等的元素。
  • 如果中间元素的前一个元素值与下标不相等,这时第一个值和下标不相等的元素一定在中甲元素的左边,下一轮查找只需要从中间元素的左边查找。
//查找第一个值和下标不相等的元素 
int GetMissingNumber(const int* numbers, int length)
{
	if(numbers==nullptr||length<=0) return -1;
	int FirstNotSame=-1;
	int low=0;
	int high=length-1; 
	while(low<=high)
	{
		int mid=(low+high)>>1;
		if(numbers[mid]!=mid) 
		{
			if((mid>0&&numbers[mid-1]==mid-1)||mid==0)
			{
				FirstNotSame=mid;
				break;
			}
			high=mid-1;
		}
		else low=mid+1;
	}
	int res=-1;
    //查到最后一个数字还没找到下标与值不相等的元素,说明缺失的数是最后一个数 
    if(low==length-1) FirstNotSame=length;
	if(FirstNotSame>=0) res=FirstNotSame;
	return res;
}

题目三:数组中数值和下标相等的元素

设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等。

 

解题思路:

二分查找值与下标相等的元素。

 

由于数组里的数字递增且唯一,

如果中间元素的值与下标相等:

  • 找到

如果中间元素 值 小于 下标:

  • 那么中间元素左边的所有元素的值都小于下标,下一轮查找只需要从中间元素的右边查找

如果中间元素 值 大于 下标:

  • 那么中间元素右边的所有元素的值都大于下标,下一轮查找只需要中中间元素的左边查找
int GetNumberSameAsIndex(const int* numbers, int length)
{
	if(numbers==nullptr||length<=0) return -1;
	int same=-1;
	int low=0;
	int high=length-1;
	while(low<=high)
	{
		int mid=(low+high)>>1;
		if(numbers[mid]==mid) 
		{
			same=mid;
			break;
		}
		if(numbers[mid]<mid) low=mid+1;
		if(numbers[mid]>mid) high=mid-1;
	}
	int res=-1;
	if(same>=0) res=numbers[same];
	return res;
} 

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模与仿真方法。研究构建了考虑非线性特性的飞行器学模型,涵盖姿态动力学与运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性与控制机制;同时,该模拟器可用于算法验证、控制器设计与教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习与仿真验证;②作为控制器(如PID、LQR、MPC等)设计与测试的仿真平台;③支持无人机控制系统教学与科研项目开发,提升对姿态控制与系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导与实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划与控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束与通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性与鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向与代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成与协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习与仿真实践的参考资料,帮助理解分布式优化与模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证与性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理与信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值