我写了三种方法第一种 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; } 三个都通过测试 都能正确查出结果反复测试后 平均成绩 第三种最快 第一种最慢(加法和递归耗费时间太多)
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));
说明有80个数是相同的,另外一个数则比其他值大
A1,A2,A3, .... , A80, A81
我是这样想的,先拿 A1和 A81比较,
若 A1 > A80,则找出的数是A1
若 A1 < A81,则该数是A81
若 A1 == A81则比较 A2和 A80
以下重复这个过程,若一直相等就一直比较
到最后如果还是相等的,说明 A41是我们要找的那个数
int[] array={A1,A2,...,A80,A81};
Arrays.sort(array);
System.out.println(array[array.length-1]);
用api ok?
如这个例子
先比较 A1 和 A6 ,因为1 == 1
则继续比较 A2 和 A5,1 == 1
比较 A3 和 A4 ,1 < 2
找出的较大的数是 2
这种方法要比较 n个数的最多次数为:
n为偶数时:n / 2 次
n为奇数时:(n - 1) / 2 次
把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
把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这样总共的判断次数只有四次
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;
}
三个都通过测试 都能正确查出结果反复测试后 平均成绩 第三种最快 第一种最慢(加法和递归耗费时间太多)
用static void sort(int[] a)方法排序
取最后一个数字
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中吗?后面能判断出来吗?
要是6 5 2 3 5 6
你怎么比较?
难道
比较 A3 和 A4 ,2 < 3
找出的较大的数是 3
要是只有一个·~
分两组最快·
要是偶数个分两组(只有两种情况)
A1 >A2 在a1中
在把A1分两组要是奇数就把最后一个去掉(三种情况)
多了一个
a1=a2 则说明是最后一个数字 最优情况下只比较一次-------
后面就递归
如果是要求效率最高,取第1个数后1条SCAS?搜索指令就可以搞定了.
而“分三组相加比较找最大那组”,不知道相加和对比在CPU上那个快呢?
就好比,1/2/3/4/5/6.。80/81,难道不是“其中只有一个数比其它数大吗?”m么?但没见得其他数就应该相等啊。
而“分三组相加比较找最大那组”的做法是基于“这里以6个数为例:1,1,1,2,1,1,则最大数为2。”的这种类似情况的数组才是可能(只是可能)。但为何就是一定三组呢?不能两组?4组?理由在哪里呢?
同时,两个数相加和两个数对比,在CPU运算(或者内存)是如何呢?是相加快呢还是对比快?1+1=2,然后继续相加,和1=1,抛弃第一个数,拿第二个数去跟第三个数比哪个快呢?
具体操作:
A1,A2,……,A81
var x=A1;
for(int i=2;i<=81;i++)
{
if(x<Ai)
x=Ai;
}
print("最大值:"+x);
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);
如果相等就接着比,如果不相等那就是其中有个是最大数,大概也就40次?
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];
}
然后temp=sum%81;
判断一个第一个和第二个数的大小
1》如果第一个大 则最大的就是第一个
2》如果第二个大 则最大的就是第二个
3》如果相等 则最大的就是temp+第一个(或者第二个数)
引用 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也是而且肯定是其他数,也不能把它给排除掉[/
不过如果这样的话可以一次比较都不用了:
令X = Sum1 - Sum2
那么要的最大数就是 A1 + |X|/2 - X/2 了
当然,如果绝对值运算算一次比较的话,那还是有一次的:)
int temp = 0 ;
for(int i...){
if(i>temp)temp=i
}
syso(temp)