一:max函数
第一大:=MAX(A1:A100)
第二大:=MAX(IF(A1:A100<MAX(A1:A100),A1:A100))
先求出小于最大值的数组,然后在数组中找到最大值,就是第二大了
二、large函数
用large函数
第一大:=LARGE(A1:A100,1)
第二大:=LARGE(A1:A100,COUNTIF(A1:A100,LARGE(A1:A100,1))+1)
求出最大值的个数n,并求出第n+1位的最大值。(因为large函数遇到数值相同的,第二大会和第一大相同)。
还能用函数找出数值多个时,在范围中出现位置:
比如刚才的公式在b5,则
第一次出现的位置:
=ADDRESS(MIN(IF(A1:A100=B5,ROW(A1:A100))),4)
或:
=ADDRESS(SMALL(IF(A1:A100=B1,ROW(A1:A100)),1),4)
最后一次出现的位置:
=ADDRESS(Max(IF(A1:A100=B5,ROW(A1:A100))),4)
或:
=ADDRESS(LARGE(IF(A1:A100=B1,ROW(A1:A100)),1),4)
同理,第二次出现的位置:
=ADDRESS(SMALL(IF(A1:A100=B1,ROW(A1:A100)),2),4)
倒数第二次出现的位置:
=ADDRESS(LARGE(IF(A1:A100=B1,ROW(A1:A100)),2),4)
需按Ctrl+Shift+Enter结束公式输入。
用两个变量max,max2,其中max储存最大值,max2储存第二大值初始化的时候,将数组中的第一个元素中较大的存进max中,较小的存进max2中
然后从第三个元素(下标为2)的元素开始,如果遇到的数比max大,就让max2=maxmax等于遇到的数
一直循环,直到数组尾部
最后输出max2
可能没有讲明白,这里重新说一下.定义两个变量max1,max2分别代表第一大和第二大的数字,我们将前两个数字大的放在max1,小的放在max2从需要遍历的第三个数字开始,如果当前数字比max2大,max2=当前数字,比较一下max1和max2,如果max1小于max2,交换一下max1和max2.
之前从max1开始比较需要比较一遍max2.现在这种思想比较好理解一点.本质上就是用堆求topk的问题.
原则上时间复杂度是nlogk,因为这里k是2,所以logk=1(一个常数),时间复杂度为O(Cn)=O(n)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)