赞
踩
次。
- /*
- 93.在一个 int 数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。直观
- 想法是用两个数组 a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到 i 的最小的数,一
- 个解答:这需要两次遍历,然后再遍历一次原数组,将所有 data[i]>=a[i-1]&&data[i]<=b[i]
- 的 data[i]找出即可。给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一
- 次。
- 同81题:
- 利用一个辅助数组,记录每一个元素右侧的最小值是多少 rightMin
- 在顺序遍历 保存当前最大值 即左边最大的
- 那么若两者相等 则满足
- 当前值大于左边所有 又是右边最小 小于右边所有
- */
- #include<iostream>
- using namespace std;
-
- #define max(a,b) a>b?a:b
- #define min(a,b) a<b?a:b
-
- void solve(int data[],int len)
- {
- int* rightMin=new int[len];
- int left_max;
-
- //输出原数组
- for(int i=0;i<len;i++)
- cout<<data[i]<<" ";
- cout<<endl;
-
- rightMin[len-1]=data[len-1];
- for (int i=len-2;i>=0;i--)//从右向左
- rightMin[i]=min(data[i],rightMin[i+1]);
-
- left_max=0;
- for (int i=0;i<len;i++)
- {
- left_max=max(data[i],left_max);
- if(left_max==rightMin[i])
- cout<<data[i]<<":大于数组左边数,小于数组右边数"<<endl;
- }
- }
-
- int main()
- {
- int data[10]={1,3,2,4,6,7,5,9,11,10};
- int data2[7] ={7,10,2,6,19,22,32};
- solve(data2,7);
-
- solve(data,10);
- }
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。