求第k大的数(武大933)

若是在链表中求倒数第k个的数,可以使用双指针法。即:设置两个指针i和j,先让j先于i走k个位置,然后i和j同时移动,直到j指向最后一个元素,那么i指向的即是链表中的倒数第k个元素。


/**
 * @program: entrance_exam
 * @description: 两个整数递增有序序列A,B分别有n个和m个元素,求第k大的数(k≥1&&k≤n+m),要求最佳的时间复杂度
 * @author: TAO
 * @create: 2018-05-30 08:30
 **/
/**算法思想:1.符合归并排序的思想,直接将A,B进行归并排序,然后在新的数组里面寻找第k大的元素,时间复杂度0(m+n);
 *
 * 方法二:直接在a,b两个数组设置两个指针i,j,直接比较数组元素大小,若a[i]>b[j],则j++,否则i++
 * 直到比较k次,即找到第k大的数
 *
 * */
class FindKth{
    public FindKth(){}
    private int []c=new int[7];
    public int mergeSort(int []a,int []b,int k){
        int m=0,i=0,j=0;
        for(i=0,j=0;i<a.length&&j<b.length;){
            if(a[i]>b[j])
                c[m++]=b[j++];
            else
                c[m++]=a[i++];
        }
        while (i<a.length) c[m++]=a[i++];
        while (j<b.length) c[m++]=b[j++];       //插入剩余的表中的数据
         return c[k-1];
    }
}
public class Exercise11 {
    public static void main(String[] args) {
        int []a=new int[]{1,3,7};
        int []b=new int[]{3,6,8,9};//定义两个单增的数组
        //int []c=new int[]{11,13,15,16};
        FindKth findKth=new FindKth();
        int kth=findKth.mergeSort(a,b,3);
        System.out.println(kth);
    }
}

猜你喜欢

转载自blog.csdn.net/sir_ti/article/details/80505129
今日推荐