已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)。这里以6个数为例:1,1,1,2,1,1,则最大数为2。

解决方案 »

  1.   

    如果不能运算一下再比较 在数列(n,n,n,n, ....n,n,m,n,n..)要找出不同的那个m也只能一个一个比较
      

  2.   


    int []a=new int[]{1,2,3,4,5,1,2,3,4,4,3,4};
    LinkedList<Integer> list=new LinkedList<Integer>();
    list.add(a[0]);
    for(int i=1;i<a.length;i++){
    if(a[i]>list.get(list.size()-1))
    list.add(a[i]);
    }
    System.out.println(list.get(list.size()-1));
      

  3.   

    其中只有一个数比其它数大
    说明有80个数是相同的,另外一个数则比其他值大
    A1,A2,A3, .... , A80, A81
    我是这样想的,先拿 A1和 A81比较,
    若 A1 > A80,则找出的数是A1
    若 A1 < A81,则该数是A81
    若 A1 == A81则比较 A2和 A80
    以下重复这个过程,若一直相等就一直比较
    到最后如果还是相等的,说明 A41是我们要找的那个数
      

  4.   


    int[] array={A1,A2,...,A80,A81};
    Arrays.sort(array);
    System.out.println(array[array.length-1]);
     
    用api  ok?
      

  5.   

    1,1,1,2,1,1,
    如这个例子
    先比较 A1 和 A6 ,因为1 == 1
    则继续比较 A2 和 A5,1 == 1
    比较 A3 和 A4 ,1 < 2
    找出的较大的数是 2
    这种方法要比较 n个数的最多次数为:
    n为偶数时:n / 2 次
    n为奇数时:(n - 1) / 2 次
      

  6.   

    再想想
    把81个数分成三组,并对其求和
    A1到A27的和为  S1,
    A28到A54的和为 S2
    A55到A81的和为 S3
    比较 S1 和 S2
    若 S1 >  S2,  说明该数在S1的27个数中
    若 S1 <  S2, 说明该数在S2的27个数中
    若 S1 == S2, 说明要找的书在S3之中
    这样,判断了一次就找到了较大数在的27个数
    再把27个分成3组
    H1  --- H9   M1
    H10 --- H18  M2
    H19 --- H27  M3
    若 M1 >  M2,   说明该数在M1的27个数中
    若 M1 <  M2,  说明该数在M2的27个数中
    若 M1 == M2,  说明要找的书在M3之中
    找出9个数,分成3组
    N1 --- N3   O1
    N4 --- N6   O2
    N7 --- N9   O3
    若 N1 >  N2,   说明该数在M1的27个数中
    若 N1 <  N2,  说明该数在M2的27个数中
    若 N1 == N2,  说明要找的书在M3之中
    找到三个数,Q1, Q2, Q3
    比较Q1 和 Q2, 
    若 Q1 >  Q2,   则较大的数是Q1
    若 Q1 <  Q2,  则较大的数是Q2
    若 Q1 == Q2,  则较大的数是Q3
      

  7.   

    上面写错了,再发一次再想想
    把81个数分成三组,并对其求和
    A1到A27的和为  S1,
    A28到A54的和为 S2
    A55到A81的和为 S3
    比较 S1 和 S2
    若 S1 >  S2,  说明该数在          S1中
    若 S1 <  S2, 说明该数在          S2中
    若 S1 == S2, 说明该数在          S3中
    这样,判断了一次就找到了较大数在的27个数
    再把27个分成3组求和
    H1  --- H9   M1
    H10 --- H18  M2
    H19 --- H27  M3
    若 M1 >  M2,   说明该数在     M1中
    若 M1 <  M2,  说明该数在     M2中
    若 M1 == M2,  说明该数在     M3中
    找出9个数,分成3组求和
    N1 --- N3   O1
    N4 --- N6   O2
    N7 --- N9   O3
    若 O1 >  O2,   说明该数在     O1中
    若 O1 <  O2,  说明该数在     O2中
    若 O1 == O2,  说明该数在     O3中
    找到三个数,Q1, Q2, Q3
    比较Q1 和 Q2, 
    若 Q1 >  Q2,   则较大的数是   Q1
    若 Q1 <  Q2,  则较大的数是 Q2
    若 Q1 == Q2,  则较大的数是 Q3这样总共的判断次数只有四次
      

  8.   

    我写了三种方法第一种 public static int search(int[] data, int left, int right) {
    int m = (left + right) / 2;
    int l = 0;
    int r = 0;
    if (left == m) {
    return m;
    }
    for (int i = left; i < m; i++) {
    l += data[i];
    }
    for (int i = m; i < right; i++) {
    r += data[i];
    }
    if (l >= r) {
    return search(data, left, m);
    } else if (l < r) {
    return search(data, m, right);
    }
    return -1;
    } public static int search(int[] data) {
    return search(data, 0, data.length);
    }
    第二种 public static int search(int[] a) {
    int m;
    int left = 0;
    int right = a.length - 1;
    if (a.length % 2 == 0) {
    m = (0 + a.length) / 2;
    } else {
    m = (0 + a.length) / 2 + 1;
    }
    while (left < m) {
    if (left == right) {
    return m - 1;
    }
    if (a[left] > a[right]) {
    return left;
    } else if (a[left] < a[right]) {
    return right;
    } else {
    left += 1;
    right -= 1;
    }
    }
    return -1;
    }
    第三种 public static int go(int[] data) {
    int a = data[0];
    int b = data[1];
    if (a > b) {
    return 0;
    } else if (a < b) {
    return 1;
    } else {
    for (int i = 2; i < data.length; i++) {
    if (data[i] > a) {
    return i;
    }
    }
    }
    return -1;
    }
    三个都通过测试 都能正确查出结果反复测试后 平均成绩 第三种最快 第一种最慢(加法和递归耗费时间太多)
      

  9.   

    将数组放入Arrays
    用static void sort(int[] a)方法排序
    取最后一个数字
      

  10.   

     这个就是错误的~~
    81的例子就不举了
     我举9个数字的
    数组:1 2 3 4 5 6 7 8 9
    存值:1 1 1 2 0 0 1 1 1
    1-3为s1 .....
    s1>s2     能说明大数在s1中吗?后面能判断出来吗?
      

  11.   

    最直接的方法一个一个去比较,要比较n-1次。排序的复杂度肯定超过O(n)乱序状态下,不可能比O(n)更小,因为只要有任意位置的一个数没参与比较,那么你就不能断定已经选中的那个数是最大的。因此最直接的方法也是最快的方法,不用太伤脑筋。我说的应该很明了吧
      

  12.   

    这个也有问题:
    要是6 5 2 3 5 6
    你怎么比较?
    难道
    比较 A3 和 A4 ,2 < 3
    找出的较大的数是 3 
      

  13.   

    晕死·~~没看见
     要是只有一个·~
    分两组最快·
    要是偶数个分两组(只有两种情况)
    A1  >A2  在a1中
    在把A1分两组要是奇数就把最后一个去掉(三种情况)
    多了一个
    a1=a2 则说明是最后一个数字  最优情况下只比较一次-------
    后面就递归
      

  14.   

    如果两个数不相等,存在加减移位运算求最大数的方法,那个这个问题不用比较运算就可以解决.
    如果是要求效率最高,取第1个数后1条SCAS?搜索指令就可以搞定了.
      

  15.   

    奇怪了,怎么看“其中只有一个数比其它数大吗?”就能得出“那么其他数应该是相等的! ”
    “分三组相加比较找最大那组”,不知道相加和对比在CPU上那个快呢?
      

  16.   

    接上面:
    就好比,1/2/3/4/5/6.。80/81,难道不是“其中只有一个数比其它数大吗?”m么?但没见得其他数就应该相等啊。
    “分三组相加比较找最大那组”的做法是基于“这里以6个数为例:1,1,1,2,1,1,则最大数为2。”的这种类似情况的数组才是可能(只是可能)。但为何就是一定三组呢?不能两组?4组?理由在哪里呢?
    同时,两个数相加和两个数对比,在CPU运算(或者内存)是如何呢?是相加快呢还是对比快?1+1=2,然后继续相加,和1=1,抛弃第一个数,拿第二个数去跟第三个数比哪个快呢?
      

  17.   

    只有一个办法:使用冒泡算法(每个数只比较一次--最少的了)
    具体操作:
    A1,A2,……,A81
    var x=A1;
    for(int i=2;i<=81;i++)
    {
       if(x<Ai)
       x=Ai;
    }
    print("最大值:"+x);
      

  18.   

    采用快速排序法 当然中间再加一个判断,算出最大数就return或是break;
      

  19.   

    一般排序算法都要O(N*log2N)   除了基数排序是O(N) ,遍历一下也就O(N)何必呢
      

  20.   

    int Data[81] = {......};int nCount = sizeof(Data) / sizeof(Data[0]);
    int i = 0;
    int nSum = 0;
    int nResult = 0;for (i = 0; i < nCount; i++)
        nSum += Data[i];if (Data[0] * nCount > nSum)
        nResult = Data[0];
    else
        nResult = nSum - Data[0] * (nCount - 1);
      

  21.   

    n个数求最值最少也比较N-1次    要么你就直接用Math类的静态方法
      

  22.   

    已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)。这里以6个数为例:1,1,1,2,1,1,则最大数为2。是不是两个两个比,因为只有一个比其他的大,就是其他的都是相等的?
    如果相等就接着比,如果不相等那就是其中有个是最大数,大概也就40次?
      

  23.   

    因为题目的特殊性:其他数都是相等的,不用比较80次.
    for(int i=0;i<len-1;){
        if(array[i]==array[i+1]){
            i = i + 2;
        }
        else 
            return array[i]>array[i+1]?array[i]:array[i+1];
    }
      

  24.   

    先将81个数求和假如为sum;
    然后temp=sum%81;
    判断一个第一个和第二个数的大小
    1》如果第一个大  则最大的就是第一个
    2》如果第二个大  则最大的就是第二个
    3》如果相等  则最大的就是temp+第一个(或者第二个数)
     
      

  25.   

    [Quote=引用 89 楼 fskjb01 的回复:]
    引用 78 楼 leedone1989 的回复:
    引用 63 楼 fskjb01 的回复:
    引用 62 楼 galford0628 的回复:
    引用 61 楼 fskjb01 的回复:
    引用 60 楼 galford0628 的回复:
    我认为这个问题的分歧就在“其中只有一个数比其它数大”和楼主的例子,抛开楼主的例子是否有误导,单纯从如何理解这个“其中只有一个数比其它数大”这句话来说,如果大家有一个一致的理解,对这个问题是很好解决的,我想大家都会,现在我认为应该讨论下如何理解这个“其中只有一个数比其它数大”,我自己想了一下感觉真的是这句话很迷惑人,如果从字面上逐字逐句理解起来,“其中只有一个数比其它数大”,那么我们可以认为如果是“¡­
    楼主说:其中只有一个数比其它数大
    你说:5比4,3,2,1也都大,那么对于5,我们可不可以说他比其他数大反问:6是啥,就不是其它数吗!!!
    我再反问下,“其他”这个词,他本身的意思是否包含所有,我的意思就是如果有个数组“1,2,3,4,5,6”,你只说比其他的数大,这个“其他”是否可以代表“其他所有的数”,如果“其他”这个词本身的含义就是在某一个范围内除了一部分以外的剩余所有部分,那么你是对的,数组应该是“1,1,1,1,1,2”,如果“其他”这个词本身并没有规定为范围内剩余所有的,那么楼主有没有为其他加上诸如“所有,全部,都”等条件,那么我为什么不能理解为5比其他的数4,3,2,1大,楼主并没有说比其他所有的数大。
    你都说明了一个范围啦从1到6,那么5和其他数比较不就是和1,2,3,4,6比较么!!!
    我的语文水平是这样理解的!!
    对你语文水平汗颜  你说过,"6就不是其它数了吗?"从这句语里看出,你也承认 1 2 3 4 也是其它数,那么5是不是比1 2 3 4 大呢?这是不是说明5也比其它数大呢?虽然它比6小
    我才应该对你的语文水平汗颜呢!!!集合{1,2,3,4,5,6}中5跟该集合中的其他数比较是不是5跟1,2,3,4,6比较,为什么非要限制{1,2,3}或{1,2,3,4}呢!!!
    Quote]
    而且我是说:“6就不是其它数了吗”这句话,我是没有排除 1 2 3 4在其他数范围之外,但更强调6也是而且肯定是其他数,也不能把它给排除掉[/
      

  26.   

    已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)。这里以6个数为例:1,1,1,2,1,1,则最大数为2。
      

  27.   

    有一个办法可以只比较一次SUM1 = A1 * 81 和 SUM2 = A1 + A2 + ...... + A81 比较, 如果 SUM2 > SUM2 大, A1就是要找的最大数,如果SUM1 < SUM2, 最大数是A1 + (SUM2 - SUM1)
      

  28.   

    哈哈,这个方法我喜欢!
    不过如果这样的话可以一次比较都不用了:
    令X = Sum1 - Sum2
    那么要的最大数就是 A1 + |X|/2 - X/2 了
    当然,如果绝对值运算算一次比较的话,那还是有一次的:)
      

  29.   

    如果是有序的话,用二分法较快,时间复杂度是o(log2N),如果一个个进行比较的话时间复杂度是o(n*n),都差不多吧
      

  30.   

    只能有序一次..类似遍历的方法时间复杂度是O(1)应该是最简单的了吧..其他的都有点误导
    int temp = 0  ;
    for(int i...){
     if(i>temp)temp=i
    }
    syso(temp)