标签:java
这个问题,感觉很简单,一看就可能首先想到几种方法,例如: 首先对这个序列进行排序,然后取第二个位置的元素;或者循环遍历元素序列,找到最大的元素,然后将其移除。再重复此过程,得到第二大的元素。
但是都没有考虑其效率。下面提出一种方法:
<span style="font-size:14px;">package algrithm;
public class secondbignum {
public static void main(String[] args)
{
int []input={1,5,6,2,3,8,7,18};
int start=0;
int end=input.length-1;
int r=findSecondNum(input,start,end);
System.out.println("the second num is:"+r);
}
public static int findSecondNum(int num[],int start,int end)
{
if(end-start>0)//注意这个条件,不然会死循环
{
int mid = (start + end) / 2;
int before = findMaxNum(num, start, mid);
int latter = findMaxNum(num, mid + 1, end);
if (before > latter) {
int temp = findSecondNum(num, start, mid);
if (temp > latter)
return temp;
else
return latter;
} else {
int temp = findSecondNum(num, mid + 1, end);
if (temp > before)
return temp;
else
return before;
}
}
return 0;
}
public static int findMaxNum(int num[],int start,int end)
{
int max=0;
for(int i=start;i<=end;i++)
{
if(num[i]>max)
{
max=num[i];
}
}
return max;
}
}
</span>思路:把n个数分成两部分,每部分都包含有n/2个数,假设为a[n/2]和b[n/2],每部分分别求最大数,假设为a[i]和b[j],如果a[i]比b[j]大,则在a[n/2]数组里找第二大数,假设为a[k],再比较a[k]和b[j],较大数就是所求的第二大数。标签:java
原文地址:http://blog.csdn.net/ccq1029/article/details/45726007