📣 独立日限时特惠: VIP通行证立减$68
楼主: edussx
跳转到指定楼层
上一主题 下一主题
收起左侧

用递归求数组最大值的位置

🔗
rogerdai 2013-2-10 22:18:30 | 只看该作者
全局:
edussx 发表于 2013-2-10 19:43
要求输出结果是4,不是9
  1. int max(const int a[], int n)
  2. {
  3.     if (n == 1)
  4.         return n;
  5.     int i = a[0];
  6.     int next_index = max(a+1, n-1)+1;
  7.     int j = a[next_index-1];
  8.         printf("n=%d\n", n);
  9.     printf("next_index=%d\n", next_index);
  10.     printf("i=%d\n", i);
  11.     printf("j=%d\n", j);
  12.     printf("///////////////////////////////////////////\n");
  13.     if (i > j)
  14.         return 1;
  15.     else
  16.         return next_index;
  17. }
复制代码
楼主看这样可以吗?不过返回的不是下标,是下标+1
比如:
  1. index = max(a, 5);
  2. value = a[index-1]
复制代码


评分

参与人数 1大米 +10 收起 理由
edussx + 10 lz用的是c++,目测不让用printf,不过还是谢.

查看全部评分

回复

使用道具 举报

🔗
lvchaoshuai 2013-2-10 23:25:54 | 只看该作者
全局:
rogerdai 发表于 2013-2-10 22:18
楼主看这样可以吗?不过返回的不是下标,是下标+1
比如:

其实我们的如出一辙哈~你的注释删了就差不多啦~思路是一样的~
回复

使用道具 举报

🔗
ryancooper 2013-2-11 08:04:37 | 只看该作者
全局:
我来贴个我的版本,不是很简洁呢
  1. int max(const int a[],int n)
  2. {
  3.     if(n <= 1)
  4.        return 0;
  5.     int i,j,mid;
  6.     mid = n/2;
  7.     i = max(a,mid);
  8.     j = max(a+mid+1,n-mid-1);
  9.     if(a[i] < *(a+mid+1+j))
  10.     {
  11.        if(*(a+mid+1+j) < a[mid])
  12.           return mid;
  13.        else
  14.           return j+mid+1;
  15.     }
  16.     else
  17.     {
  18.        if(a[i] < a[mid])
  19.           return mid;
  20.        else
  21.           return i;
  22.     }
  23. }
复制代码
回复

使用道具 举报

🔗
cctv3568 2013-2-12 12:17:00 | 只看该作者
全局:
1、lz的思路已经很巧妙了,只要把返回值换回成数组的下标,注意比较时取数组值即可。
2、代码中还要加一个容错处理,就是当输入值n<1时,(0或负数都可能),函数的返回值,或者做报错信号,或者兼容n=1处理。
回复

使用道具 举报

🔗
randchina 2013-7-31 13:42:17 | 只看该作者
全局:
学到很多,10楼的果然很简洁
回复

使用道具 举报

🔗
LinRaise 2013-8-1 18:04:24 | 只看该作者
全局:
  1. int MaxIndex2(int* A,int n)
  2. {
  3.         if(n==1)
  4.                 return 0;
  5.         int mid=n/2;
  6.         int left=MaxIndex(A,mid);
  7.         int right=MaxIndex(A+mid,n-mid);
  8.         return A[left] > A[right+mid]?left : right+mid;
  9. }
复制代码
新人飘过,这个时间复杂度可以达到o(lgn)
回复

使用道具 举报

🔗
crazyai 2013-8-7 12:53:14 | 只看该作者
全局:
LinRaise 发表于 2013-8-1 18:04
新人飘过,这个时间复杂度可以达到o(lgn)

这个复杂度是O(n)的吧,T(n)=2T(n/2)+O(1),由主定理得O(n)
从另一方面想,从无序数组中找到最大值下标,至少需要把所有值都扫一遍啊,至少是O(n)
回复

使用道具 举报

🔗
JAGUAR 2013-8-7 13:35:24 | 只看该作者
全局:
本帖最后由 JAGUAR 于 2013-8-7 14:02 编辑
lvchaoshuai 发表于 2013-2-10 22:18
目测样例是有

这道题有很明显的函数式编程的风格啊, ocaml code:
  1. let rec max l =
  2.     match l with
  3.     | [h] -> 0
  4.     | h::t ->     
  5.          let x = (max t) in                    
  6.            if (h > (List.nth t x)) then 0
  7.            else x+1;;
复制代码


回复

使用道具 举报

🔗
BoLuoMi996 2013-8-7 20:20:17 | 只看该作者
全局:
int max(int a[], int low, int high){
    if(low<high-1){
         int mid = low + (high-low)/2;
         int lmax = max(a,low,mid);
         int hmax = max(a,mid+1,high);
         if(a[lmax]<a[hmax]) return hmax;
         else return lmax;
    }else if(low==high-1){
          if(a[low]<a[high]) return high;
          else return low;
    }else if(low==high){
           return low;
    }else{
          return -1;
   }
}
     
回复

使用道具 举报

全局:
  1. int max(const int a[], int n)
  2. {
  3.         if (n == 1) return 0;
  4.     int n1 = max(a, n/2);
  5.         int n2 = n/2 + max(a + n/2, n - n/2);
  6.         return a[n1] > a[n2] ? n1:n2;
  7. }
复制代码
lvchaoshuai大牛那样太优雅的代码一般不容易一眼看懂 我来个土一点的(其实是开始感觉二分速度会快点写完发现没区别。。。)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表