当前位置:   article > 正文

在一个数组中,找出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它_给定一个长度为 n 的数组, 找所有满足以下条件的数 a[i]:左边的数都比 a[i] 大右

给定一个长度为 n 的数组, 找所有满足以下条件的数 a[i]:左边的数都比 a[i] 大右

一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都
大于等于它。能否只用一个额外数组和少量其它空间实现。
思想:一看这题,就想到快速排序中的 一次排序, 左边<=某个数<=右边
so: 如果原数组与排好序的数组 一一比较,a[i]==b[i] 不就是所求么?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void pr_arr(int arr[],int len)
  5. {
  6. if(arr==NULL || len<1) return;
  7. pr_arr(arr,len-1);
  8. printf("%-4d ",arr[len-1]);
  9. }
  10. int cmp(const void *a, const void *b)
  11. {
  12. return *(int *) a - *(int *) b;
  13. }
  14. void findNumBiggerLeftSmallerRight(int src[],int len)
  15. {
  16. if(src==NULL || len <1) return ;
  17. int i=0;
  18. int *buff=(int *)malloc(sizeof(int)*len);
  19. memcpy(buff,src,sizeof(int)*len);
  20. qsort(buff,len,sizeof(int),cmp);
  21. printf("original arr:\n");
  22. pr_arr(buff,len);
  23. printf("\nqsort arr:\n");
  24. pr_arr(buff,len);
  25. printf("\nthe result:\n");
  26. for(i=0;i<len;i++)
  27. {
  28. if(src[i]==buff[i])
  29. printf("%d:%d ",i,src[i]);
  30. }
  31. //free
  32. free(buff);
  33. }
  34. int main(void) {
  35. int src[]={21,34,34,45,45,56,565,67,67,768,32};
  36. findNumBiggerLeftSmallerRight(src,sizeof(src)/sizeof(int));
  37. return 0;
  38. }

 

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

闽ICP备14008679号