每日一题(61) - 找出左边比它小,右边比它大的数
来源:互联网 发布:js面向对象实现过程 编辑:程序博客网 时间:2024/04/29 11:15
题目来自网络
题目:
给出一个元素无序的数组,求出一个数,使得其左边的数都小于它,右边的数都大于等于它。
举例:1,2,3,1,2,0,5,6,返回下标6(数字为5)。
思路(1):
朴素算法,对于每一个数,都检测它的左边和右边是否满足题意。
时间复杂度为O(n^2)
思路(2)
使用变量求解:
(1)目前找到符合题意的候选值,nCandid
(2)目前已遍历数组的最大值,nMax:为了选下一次的候选值
(3)目前的候选值是否有效,bIsExist:检测是否需要重新选择候选值
思路:如果候选值有效,可以继续遍历下面的数据
如果候选值小于目前的值,则该候选失效。之后遍历元素时,就要重新选择候选值
选择候选值时,对于某一个元素,如果该元素比之前遍历过元素的最大值还要大nMax,则该元素就为候选。
复杂度:遍历一遍数组即可,时间:O(n),空间O(1)
代码
#include <iostream>#include <assert.h>#include <list>using namespace std;int FindNum(int nArr[],int nLen){assert(nArr && nLen > 0);int nPos = 0;int nCandid = nArr[0];int nMax = nArr[0];bool bIsExist = true;for (int i = 1;i < nLen;i++){if (bIsExist)//候选有效{if (nCandid > nArr[i])//候选失效{bIsExist = false;}else{nMax = nArr[i];}}else //候选失效{if (nArr[i] >= nMax)//重新找到候选{bIsExist = true;nCandid = nArr[i];nMax = nArr[i];nPos = i;}}}return bIsExist ? nPos : -1; }int main(){ int nArr[8] = {1,2,3,1,2,0,5,6}; int nPos = FindNum(nArr,8); if (nPos == -1) { cout<<"不存在!"<<endl; } else { cout<<nArr[nPos]<<endl; }// int nArr[7] = {7,7,7,7,7,7,7};// int nPos = FindNum(nArr,7);// if (nPos == -1)// {// cout<<"不存在!"<<endl;// }// else// {// cout<<nArr[nPos]<<endl;// }// int nArr[7] = {1,2,3,4,5,6,7};// int nPos = FindNum(nArr,7);// if (nPos == -1)// {// cout<<"不存在!"<<endl;// }// else// {// cout<<nArr[nPos]<<endl;// }// int nArr[7] = {7,6,5,4,3,2,1};// int nPos = FindNum(nArr,7);// if (nPos == -1)// {// cout<<"不存在!"<<endl;// }// else// {// cout<<nArr[nPos]<<endl;// } system("pause");return 1;}
题目二
题目:
给出一个元素无序的数组,求出使得其左边的数都小于它,右边的数都大于等于它的所有数字。
举例:
(1)1,2,3,1,2,0,5,6 : 输出5,6
(2)1,2,3,1,2,0,5,5 : 输出5(第一个5)
(3)1,2,3,4,5,6,7 : 输出1,2,3,4,5,6,7
思路:
使用一个数组nArrMin[i]来保存[i,nLen-1]区间内的最小值。
使用一个变量nMax保存区间[0,i-1]的最大值。
对于第i个数,如果它满足nArr[i]大于左边的最大数nMax 且 小于右边的最小数nArrMin[i],则该数即为所求。
复杂度:时间:O(n),空间O(n)
代码
#include <iostream>#include <assert.h>#include <list>using namespace std;void FindNum(int nArr[],int nLen){assert(nArr && nLen > 0);int nPos = 0;int nMax = -0x3f3f3f3f;int nArrMin[100];nArrMin[nLen - 1] = nArr[nLen - 1];//遍历一遍数组,记录区间[i,len-1]的最小值,并保存到数组nArr[i]中for (int i = nLen - 2;i >= 0;i--){if (nArr[i] > nArrMin[i + 1]){nArrMin[i] = nArrMin[i + 1];}else{nArrMin[i] = nArr[i];}}//遍历一遍数组,求解满足题意的数for (int i = 0;i < nLen;i++){if (nArr[i] > nMax){if (nArr[i] <= nArrMin[i]){//nArr[i]比左边数的最大值还要大且比右边数的最小值还要小,则输出cout<<nArr[i]<<" ";}nMax = nArr[i];}}}int main(){int nArr[8] = {1,2,3,1,2,0,5,6};FindNum(nArr,8);//5 6 // int nArr[7] = {1,2,3,4,5,6,7};// FindNum(nArr,7);//1,2,3,4,5,6,7}// int nArr[7] = {7,6,5,4,3,2,1};// FindNum(nArr,7);//不存在// int nArr[7] = {7,7,7,7,7,7,7};// FindNum(nArr,7);//7system("pause");return 1;}
- 每日一题(61) - 找出左边比它小,右边比它大的数
- 数组中存在这样的数,这个数比它左边的所有的数大,并且比它右边的所有的数小,返回它的索引;如果不存在,返回-1
- 如果数组中存在这样的数,这个数比它左边的所有的数大,并且比它右边的所有的数小,返回它的索引;如果不存在,返回-1。
- 找出数组中每个数的右边第一个比它大的数
- 微软100题(93)找出数组中比左边的大比右边的小的元素
- 一个数组,找出其中具有这样一个特性的数字:1、比它左边的数都大2、比它右边的数都小
- 左边最近的比它大的元素
- 找出第一个比左边数都大,比右边数都小的数的索引和值
- 找出下一个比它大而且值为1的位元数与之相同的数字
- 数字串前第一小比它小的数
- poj 2299 Ultra-QuickSort(利用树状数组变形,求一个数左边比它大的数的个数)
- 在数组中 找左边都比其小右边都比其大的元素
- 对于一个非常大的数,如何快速高效返回比它小的最大质数【腾讯笔试题】
- 找出数组中满足其左边的数都小于等于它,右边的数都大于等于它的数
- 在一个数组中,找出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 算法面试题,在数组中找出这样的数,它比它前面的数都大,比它后面的数都小
- 左边的数都小于等于它,右边的数都大于等于它
- 找出数组中有元素比它的邻居大的元素下标
- VNC 抓取远程桌面
- 买 gold了... ...
- vs2008+opencv2.3配置
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
- 前端技术学习之道:jquery js 重置表单 reset()
- 每日一题(61) - 找出左边比它小,右边比它大的数
- Ajax使用POST方式异步提交数据
- 从键盘输入11个数存入一维数组中,将该数组中左半部分与右半部分的值平移交换后重新存入该数组 中并输出?
- Android面试题精选,自己收藏下
- Android---App Widget(四)
- hdu 2665 Kth number || poj 2761 Feed the dogs || poj 2104 K-th Number
- 输入一行字符,统计单词个数?(单词:单个字母以上字母的集合)
- Linux下的图形界面——X Window的安装
- PHP Liunx 服务安全防范方案