0
点赞
收藏
分享

微信扫一扫

93 求数组,左边的数都小于等于它,右边的数都大于等于它

Ad大成 2023-02-20 阅读 50


93.在一个 int  数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。直观
想法是用两个数组 a、b。a[i]、b[i]分别保存从前到 i  的最大的数和从后到 i  的最小的数,一
个解答:这需要两次遍历,然后再遍历一次原数组,将所有 data[i]>=a[i-1]&&data[i]<=b[i]
的 data[i]找出即可。给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一

次。

/*
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);
}

93 求数组,左边的数都小于等于它,右边的数都大于等于它_i++



举报

相关推荐

mybatis中大于等于小于等于的写法

0 条评论