标签: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