Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519679
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-04-21 10:10:17

题目:主要的任务是遍历二维数组,找出数组中行最小列最大的元素,称为马鞍点。

方法一:针对二维数组的每一个元素对它的同行同列都进行判断,如果是则将flag设为1并且输出,否则设为0;
               时间复杂度:o(n^3)

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #define M 20
  3. int main()
  4. {
  5.     int data[M][M];
  6.     int row, col, inx, iny, min;
  7.     int flag = 1;
  8.     int i,j;
  9.     int count=0;
  10.     printf("please input the col and row\n");
  11.     scanf("%d%d",&row, &col);
  12.     getchar();//接收‘\n’
  13.     printf("please input the memeber of \n");
  14.     for(inx = 0; inx < row; inx++)
  15.         for(iny = 0; iny < col; iny++)
  16.                 scanf("%d",&data[inx][iny]);//输入数组的元素
  17.     for(inx = 0; inx < row; inx++)
  18.         for(iny =0; iny < col; iny++){//对每一个二维元素进行判断
  19.              for(i=0; i < col; i++)
  20.                  if(data[inx][iny]>data[inx][i])
  21.                      flag = 0;//利用flag进行标志
  22.              for(i=0;i<row&&flag;i++)
  23.                  if(data[inx][iny]<data[i][iny])
  24.                      flag = 0;
  25.             if(flag==1){
  26.                    printf("%d: [%d][%d]; \n",data[inx][iny],inx,iny);
  27.                    count++;
  28.             }
  29.             flag =1;}
  30.      printf("gong you %d\n",count);
  31.      return 0;
  32. }
方法二根据 ‘空间复杂度换时间复杂度’ 的思想,多增加了一个一维数组。对于马鞍点来讲,相等的值是一种特例,例如:1  1  1,因此多申请一个数组用于记录每行的最小是位置,下次直接根据位置进行新的判断。
                    
1  1  1
               
时间复杂度:最好是 o(n)----------最坏:o(n^2)
       

  1. #include<stdio.h>
  2. #define M 20

  3. int main()
  4. {
  5.     int data[M][M];
  6.     int count[M]={0};
  7.     int row, col, inx, iny,i=0;
  8.     int cnt=0;
  9.     printf("please input the col and row\n");
  10.     scanf("%d%d",&row, &col);

  11.     getchar();
  12.     printf("please input the memeber of \n");
  13.     for(inx = 0; inx < row; inx++)
  14.         for(iny = 0; iny < col; iny++)
  15.                 scanf("%d",&data[inx][iny]);
  16.     for(inx = 0; inx < row; inx++)
  17.          {
  18.              i = 1;
  19.              count[1]=0;
  20.              count[0] = 1;//记录一行满足条件的个数
  21.              for(iny =1; iny < col; iny++)
  22.                  if(data[inx][count[1]] > data[inx][iny])
  23.                  {
  24.                      i = 1;
  25.                      count[0]=1;
  26.                      count[1]=iny;//记录行中较小的点的位置。
  27.                  }
  28.                  else if(data[inx][count[1]]==data[inx][iny])//处理行中有相等的数据
  29.                  {
  30.                      count[++i]=iny;
  31.                      count[0]++;
  32.                  }
  33.              i =1;
  34.         while(count[0]>0){
  35.             for(iny = 0; iny < row && data[inx][count[i]]>=data[iny][count[i]]; iny++)
  36.                              ;
  37.                if(iny >= row)
  38.                      printf("%d: [%d][%d]\n",data[inx][count[i]],inx,count[i]);
  39.                  i++;
  40.                  count[0]--;
  41.              }
  42.          }

  43.     printf("\n");
  44.     return 0;
  45. }

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