当前位置:   article > 正文

93 求数组,左边的数都小于等于它,右边的数都大于等于它_返回数组中左边都小于,右边都大于的集合

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

次。

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/227698?site
推荐阅读
相关标签
  

闽ICP备14008679号