解题笔记(27)——找数组中的特定元素
来源:互联网 发布:mac漫画阅读器 编辑:程序博客网 时间:2024/06/06 02:32
http://blog.csdn.net/wuzhekai1985/article/details/6716370
解题笔记(27)——找数组中的特定元素
分类: 解题笔记 2011-08-24 21:19 2201人阅读 评论(1)收藏举报
null
问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值。有了这两个辅助数组后,对于a[i],如果它大于Max[i-1]并且小于Min[i+1],那么就符合要求。
但是题目要求是只用一个额外数组,其实Max数组可以省去,完全可以边判断边计算,这是因为Max[i]是自左往右计算的,而判断时也是自左往右,两个过程正好可以合起来。只需用一个变量Max保存一下当前的最大值即可。下面给出两种方法的代码实现。
参考代码:
- //函数功能 : 找元素
- //函数参数 : pArray指向数组,len为数组的元素个数
- //返回值 : 无
- void FindElements_Solution1(int *pArray, int len)
- {
- if(pArray == NULL || len <= 0 )
- return ;
- int *pMin = new int[len];
- int *pMax = new int[len];
- int i;
- pMax[0] = pArray[0];
- for(i = 1; i < len; i++) //计算自i往前最大值的辅助数组
- pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i];
- pMin[len-1] = pArray[len-1];
- for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组
- pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];
- if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件
- cout<<pArray[0]<<' ';
- for(i = 1; i < len - 1; i++)
- {
- if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求
- cout<<pArray[i]<<' ';
- }
- if(pArray[len-1] >= pMax[len-1]) //检查第len个元素是否满足条件
- cout<<pArray[i];
- cout<<endl;
- delete [] pMin;
- delete [] pMax;
- pMin = pMax = NULL;
- }
//函数功能 : 找元素//函数参数 : pArray指向数组,len为数组的元素个数//返回值 : 无void FindElements_Solution1(int *pArray, int len){if(pArray == NULL || len <= 0 )return ;int *pMin = new int[len];int *pMax = new int[len];int i;pMax[0] = pArray[0];for(i = 1; i < len; i++) //计算自i往前最大值的辅助数组pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i];pMin[len-1] = pArray[len-1];for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件cout<<pArray[0]<<' ';for(i = 1; i < len - 1; i++){if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求cout<<pArray[i]<<' ';}if(pArray[len-1] >= pMax[len-1]) //检查第len个元素是否满足条件cout<<pArray[i];cout<<endl;delete [] pMin;delete [] pMax;pMin = pMax = NULL;}
- void FindElements_Solution2(int *pArray, int len)
- {
- if(pArray == NULL || len <= 0 )
- return ;
- int *pMin = new int[len];
- int Max;
- int i;
- Max = pArray[0];
- pMin[len-1] = pArray[len-1];
- for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组
- pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];
- if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件
- cout<<pArray[0]<<' ';
- for(i = 1; i < len - 1; i++)
- {
- if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求
- cout<<pArray[i]<<' ';
- Max = (Max < pArray[i])? pArray[i]: Max; //更新当前最大值
- }
- if(pArray[len-1] >= Max) //检查第len个元素是否满足条件
- cout<<pArray[i];
- cout<<endl;
- delete [] pMin;
- pMin = NULL;
- }
void FindElements_Solution2(int *pArray, int len){if(pArray == NULL || len <= 0 )return ;int *pMin = new int[len];int Max;int i;Max = pArray[0];pMin[len-1] = pArray[len-1];for(i = len - 2; i >= 0; i--) //计算自i开始最小值的辅助数组pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i];if(pArray[0] <= pMin[0]) //检查第1个元素是否满足条件cout<<pArray[0]<<' ';for(i = 1; i < len - 1; i++){if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //满足这个关系式的元素符合要求cout<<pArray[i]<<' ';Max = (Max < pArray[i])? pArray[i]: Max; //更新当前最大值}if(pArray[len-1] >= Max) //检查第len个元素是否满足条件cout<<pArray[i];cout<<endl;delete [] pMin;pMin = NULL;}
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985
0 0
- 解题笔记(27)——找数组中的特定元素
- 解题笔记(27)——找数组中的特定元素
- 解题笔记(35)——旋转数组中的最小元素
- 【算法总结-数组相关】 数组中找特定元素相关~
- 【算法总结-数组相关】 数组中找特定元素相关~
- Java 找数组中的元素
- 找两个数组中的相同元素
- 找一个数组中的主元素
- 找一个数组中的主元素
- 找元素值在数组中的位置
- 算法导论学习笔记——找数组中第i小的元素
- PHP删除数组中的特定元素的代码
- PHP删除数组中的特定元素的代码
- LeetCode:Remove Element(删除数组中的特定元素)
- PHP删除数组中的特定元素的代码
- 数组找missing元素
- 数组分割——解题笔记
- 找一个数组中的前k小的元素
- 谈谈你喜欢的开发环境。(例如操作系统,编辑器,浏览器,工具等等。)
- Spring常见面试题_1
- Fragment的setUserVisibleHint方法实现懒加载
- spark1.1的部署、sparksql CLI、sparksql-jdbc运用
- 一位ACMer过来人的心得
- 解题笔记(27)——找数组中的特定元素
- 【Andriod】命令设置系统时间
- java程序为什么比c++运行效率低
- Thread Local Storage(TLS)
- 离开校园的第一年
- 连接虚拟机时候网段改成统一也连接不上的原因
- 华为机试—频率最小的字符
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 2015 年初,新年新气象