Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877825
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-09-03 10:22:34

求数组中元素间的最近距离(一)

问题描述:数组arr[]中存在N个元素(数组中N个元素没有范围),找到这样的a和b,使得abs(a,b)的值最小。

解决思路:这是个比较简单的问题了,思路也很容易想到,只需要将arr进行排序,这时数组中元素的最短距离只可能是相邻的两个元素之间,这个算法的时间复杂度是:O(N*logN)。如果不对数组进行排序,那么就需要枚举数组中的每两个元素了,求出最小距离,时间复杂度是O(N*N)。

点击(此处)折叠或打开

  1. #include
  2. #include
  3. #define N 10
  4. int arr[N];
  5. //要注意是绝对值
  6. int minDistance(int arr[],int n)
  7. {
  8.     int min=1000000,temp;
  9.     for(int k=0;k
  10.     {
  11.         temp=abs(arr[k]-arr[k+1]);
  12.         if(min>temp)
  13.             min=temp;
  14.     }
  15.     return min;
  16. }

  17. int main()
  18. {
  19.     for(int i=0;i
  20.     {
  21.         scanf("%d",&arr[i]);
  22.     }
  23.     int min=minDistance(arr,N);
  24.     printf("%d\n",min);
  25.     return 0;
  26. }
  27. /*
  28. -1 4 5 8 23 67 69 70 72 75
  29. 1
  30. Press any key to continue

  31. */
求两个数组中的相同元素 
问题描述:现在有两个已经排好序的整数数组arr1和arr2,找出两个数组中的相同元素。 

解决思路:既然已经排好序了,那么问题就简单了,假设arr1[2]和arr2[4]相等,那么搜索arr1[3]只需要和arr2[5]及以后的元素比较。如果arr1和arr2中元素的个数分别是N和M,那么这个算法的时间复杂度是O(N+M),不妨先看看代码。 


点击(此处)折叠或打开

  1. #include
  2. #define M 10
  3. #define N 15
  4. int A[M];
  5. int B[N];

  6. int commonArray(int A[],int m, int B[],int n)
  7. {
  8.     int i=0,j=0,count=0;
  9.     while(i
  10.     {
  11.         if(A[i]==B[j])
  12.         {
  13.             printf("%d %d\n",A[i],B[j]);
  14.             count++;
  15.             i++;
  16.             j++;
  17.         }
  18.         else if(A[i]
  19.         {
  20.             i++;
  21.         }
  22.         else
  23.         {
  24.             j++;
  25.         }
  26.     }
  27.     return count;
  28. }

  29. int main()
  30. {
  31.     int i;
  32.     for(i=0;i
  33.     {
  34.         scanf("%d",&A[i]);
  35.     }
  36.     for(i=0;i
  37.     {
  38.         scanf("%d",&B[i]);
  39.     }
  40.     int count=commonArray(A,M,B,N);
  41.     printf("\nthe number of array %d\n",count);
  42.     return 0;
  43. }
  44. /*
  45. 1 3 5 7 9 10 13 16 18 20
  46. 1 4 5 7 9 11 13 16 19 20 24 26 27 28 29

  47. 1 3 5 7 9 10 13 16 18 20
  48. 1 4 5 7 9 11 13 16 19 20 24 26 27 28 29
  49. 1 1
  50. 5 5
  51. 7 7
  52. 9 9
  53. 13 13
  54. 16 16
  55. 20 20

  56. the number of array 7
  57. Press any key to continue


  58. */

小结:对于这个问题arr1和arr2数组都已经是排好序的,那么如果两个数组都不是排好序的呢??后来在网上查了点资料,发现这样一个哈希的思路:遍历一遍arr1,建立哈希表,然后遍历一遍arr2,看看哪一个元素存在于哈希表中。这样一来时间复杂度还是O(N+M),但是多引入了O(N)的空间复杂度。 

求数组中的最大值(最小值)

问题描述:给定一个整数数组arr,找出其中的最大值(最小值)。

解决思路:传统的方法就是遍历一次数组即可得到最大值(最小值),时间复杂度是O(N);现在说另外一个思路利用二分,即将数组分成元素数目接近相等的两部分,然后分别找到两个部分的的最大值(最小值),最后合并,比较两个部分的最大值(最小值),即可得到最终的最大值(最小值)。


点击(此处)折叠或打开

  1. #include
  2. #define N 15
  3. int B[N];
  4. #define max(a,b) (a>b)? a:b
  5. #define min(a,b) (a

  6. struct node
  7. {
  8.     int max,min;
  9. };

  10. struct node MaxandMin(int B[],int l,int r)
  11. {
  12.     struct node num;
  13.     //递归必定要设定返回条件
  14.     if(l==r)//l与r之间只有一个元素
  15.     {
  16.         num.max=B[l];
  17.         num.min=B[r];
  18.         return num;
  19.     }
  20.     else if(l+1 == r)
  21.     {
  22.         if(B[l]>B[r])
  23.         {
  24.             num.max=B[l];
  25.             num.min=B[r];
  26.         }
  27.         else
  28.         {
  29.             num.max=B[r];
  30.             num.min=B[l];
  31.         }
  32.         return num;
  33.     }
  34.     
  35.     int mid=(l+r)/2;
  36.     //int lmin,lmax,rmin,rmax;
  37.     struct node lnode,rnode;
  38.     lnode=MaxandMin(B,l,mid);
  39.     rnode=MaxandMin(B,mid+1,r);
  40.     num.min=min(lnode.min,rnode.min);
  41.     num.max=max(lnode.max,rnode.max);
  42.     return num;
  43. }

  44. int main()
  45. {
  46.     for(int i=0;i
  47.     {
  48.         scanf("%d",&B[i]);
  49.     }
  50.     struct node num=MaxandMin(B,0,N-1);
  51.     printf("%d %d\n",num.min,num.max);
  52.     return 0;
  53. }
  54. /*
  55. 1 4 5 7 9 11 13 16 19 20 24 26 27 28 29
  56. 1 29
  57. Press any key to continue
  58. */







阅读(1430) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~