算法练习:重叠区间个数

一、题目描述

给定多个可能重叠的区间,找出重叠区间的个数。

举例如下:

输入:[15][1015][510][2030]

输出:2

 

说明:题意应该是找出重叠区间中区间的最大个数,当没有区间重叠时,重叠个数最大为1,比如

输入为:[15][1015],则输出为1

输入为:[12][23][34][45],则输出为2重叠区间相互之间都要有交集);

输入为:[17][25][34][815][917][2025],则输出为3

 

二、题目分析

此题解题方法比较简单,只要将区间分隔成各个点,每个点有两个属性,一个是值,一个是标志(0起点,1止点),然后对这些点排序,最后,从头开始扫描排序的结果,遇到起点重叠个数加1,遇到止点重叠个数减1,并且记录好重叠个数的最大值。

本算法的时间复杂度为O(nlogn),因为算法时间主要消耗在排序上。

 

三、算法实现

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4. #include <cmath>  
  5. #include <Windows.h>  
  6. using namespace std;  
  7.   
  8.   
  9. //区间定义  
  10. class Interval  
  11. {  
  12. public:  
  13.     Interval( int iStart, int iEnd)  
  14.         :m_iStart( iStart), m_iEnd(iEnd){}  
  15.     int m_iStart;  
  16.     int m_iEnd;  
  17. };  
  18.   
  19. typedef vector<Interval> IntervalVec;  
  20.   
  21.   
  22. //区间拆分的点定义  
  23. class PointComparable  
  24. {  
  25. public:  
  26.     PointComparable( int iVal, int iType )  
  27.         :m_iVal( iVal ), m_iType( iType ){}  
  28.   
  29.     //重载小于操作符,排序使用  
  30.     bool operator < ( const PointComparable& pcPoint )  
  31.     {  
  32.         if ( this->m_iVal == pcPoint.m_iVal )  
  33.         {  
  34.             return this->m_iType < pcPoint.m_iType;  
  35.         }  
  36.         return this->m_iVal < pcPoint.m_iVal;  
  37.     }  
  38.   
  39.     int m_iVal;  
  40.     int m_iType;//点类型,0为起点,1为终点  
  41. };  
  42.   
  43. int GetOverlappedIntervalMaxCount( const IntervalVec& intvVec )  
  44. {  
  45.     vector<PointComparable> pcVec;  
  46.     for ( IntervalVec::const_iterator it = intvVec.begin();  
  47.         it != intvVec.end(); ++it )  
  48.     {  
  49.         pcVec.push_back( PointComparable( it->m_iStart, 0 ) );  
  50.         pcVec.push_back( PointComparable( it->m_iEnd, 1 ) );  
  51.     }  
  52.   
  53.     sort( pcVec.begin(), pcVec.end() );  
  54.   
  55.   
  56.   
  57.     int iMaxCount = 0;  
  58.     int iCurCount = 0;  
  59.     for ( vector<PointComparable>::iterator itTemp = pcVec.begin();  
  60.         itTemp != pcVec.end(); ++itTemp )  
  61.     {  
  62.         cout << itTemp->m_iVal << " " << itTemp->m_iType << endl;  
  63.         if ( itTemp->m_iType == 0 )  
  64.         {  
  65.             iCurCount++;  
  66.             iMaxCount = __max( iCurCount, iMaxCount );  
  67.         }  
  68.         else  
  69.         {  
  70.             iCurCount--;  
  71.         }  
  72.     }  
  73.   
  74.     return iMaxCount;  
  75. }  
  76.   
  77. int main()  
  78. {  
  79.     IntervalVec intvVec;  
  80. //  intvVec.push_back( Interval(1,5) );  
  81. //  intvVec.push_back( Interval(5,10) );  
  82.   
  83. //  intvVec.push_back( Interval(1,7) );  
  84. //  intvVec.push_back( Interval(2,5) );  
  85. //  intvVec.push_back( Interval(3,6) );  
  86. //  intvVec.push_back( Interval(8,15) );  
  87. //  intvVec.push_back( Interval(9,17) );  
  88. //  intvVec.push_back( Interval(20,25) );  
  89.   
  90.     intvVec.push_back( Interval(1,2) );  
  91.     intvVec.push_back( Interval(2,3) );  
  92.     intvVec.push_back( Interval(3,4) );  
  93.     intvVec.push_back( Interval(4,5) );  
  94.   
  95.   
  96.       
  97.   
  98.     cout << "最大重叠区间个数:" << GetOverlappedIntervalMaxCount( intvVec )    
[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>cout << endl;  
  2.     return 0;  
  3. }  

系列文章说明:
1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。
2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!
3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值