这一题是寻找最大数和最小数的扩展问题,采用了与解法相同的分治思想,每次都将数组分成2个2个一组,找出其中的最大值,保存子数组之间的最大数和次大数,比较完整个数组之后,次大数即为数组的次大数。具体实现如下所示:

public class FindTheSecond{
    int first,second;
    public int find(int [] a,int start,int end){
        int mid = (start+end)/2;
        
        if(end-start>1){
            int m=find(a,start,mid);
            int n=find(a,mid+1,end);

            if(m>n){
                if(m>first){
                    first = m;
                }
                if(n>second){
                    second = n;
                }
                return m;
            }else{
                if(n>first){
                    first = n;
                }
                if(m>second){
                    second = m;
                }
                return n;
            }
        }else{
            if(a[start]>a[end]){
                return a[start];
            }else
                return a[end];
        }
        

    }

    public static void main(String [] args){
        int a[] = {5,6,8,3,7,9,12,31,65,21};
        FindTheSecond ftc = new FindTheSecond();
        ftc.find(a,0,9);
        System.out.println("second num is :"+ftc.second);
    }
}