当前位置:   article > 正文

一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它_c语言找出数组中左边都小于它右边都大于它的数

c语言找出数组中左边都小于它右边都大于它的数

首先汇总一下各种思路:

1.最原始的做法,检测每一个元素,看它左边的元素是不是小于等于它,右边的元素是不是大于等于它。但这样做时间复杂度会比较大为O(N^2)。

2.第二种做法是对Array[ ]进行快排,得到B[ ],当Array[i]与B[i]相等时,就得到了我们想要的元素。

3.可以用两个辅助数组,Max[i]和Min[i],Max是存储数组中下标从0到i的最大值,Min是存储数组中下标从i到N-1(N为数组的长度)的最小值,这样当Max[i] Min[i] array[i]三者相等时,就得到了我们想要的。实际上,个人感觉只需要Max[i]和Min[i]相等,即可满足条件,但缺乏足够的数学证明,待续吧。。这种解法的时间复杂度为O(N),但会话费两个数组的空间。

4.这种算法是在第三种算法基础上的改进,只用到了一个辅助数组rightMin[ ],然后遍历数组array,过程中始终求解下标为0到当前i的最大值nMax,如果下一个元素array[j]>=nMax&&array[j]=rightMin[j], j=i+1,那么我们就等到了想要的元素。

下面给出第四种算法的代码:

  1. #include <iostream>
  2. using namespace std;
  3. int findN(int array[], int len)
  4. {
  5. int* rightMin = new int[len];
  6. int min = INT_MAX;
  7. for (int i = len-1; i >= 0; i--)
  8. {
  9. if (array[i] < min)
  10. min = array[i];
  11. rightMin[i] = min;
  12. }
  13. int max = INT_MIN;
  14. for (int i = 0; i < len; i++)
  15. {
  16. if (array[i] >= max) //此处如果不加=,那么对于数组 {7, 19, 2, 6, 19, 22, 32},就找不到19。
  17. {
  18. max = array[i];
  19. if (max == rightMin[i])
  20. {
  21. return i;
  22. }
  23. }
  24. }
  25. delete[] rightMin;
  26. return -1;
  27. }
  28. int main()
  29. {
  30. int array[] = {7, 19, 2, 6, 19, 22, 32};
  31. int len = 7;
  32. int index = findN(array, len);
  33. if (index != -1)
  34. {
  35. cout<<"the index is : "<<index<<endl<<"the element is : "<<array[index]<<endl;
  36. }
  37. else
  38. {
  39. cout<<"sorry, cannot find it."<<endl;
  40. }
  41. }


 

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

闽ICP备14008679号