寻找数组中的第K大的元素&找数组中重复数字

问题1:寻找数组中的第K大的元素。

public class FindMaxKNum {
    public static void main(String args[]) {
        int a[] = new int[]{3,5,2,8,-1,7,1,10};
        System.out.println(findKMaxNum(a, 0, a.length - 1, 6));
    }

    static int findKMaxNum(int[] a, int start, int end, int num) {
        int tmp = a[start], i=start, j=end;
        while(i != j) {
            while (a[j] > tmp && i < j){
                j--;
            }
            a[i] = a[j];
            while(a[i] < tmp && i < j) {
                i++;
            }
            a[j] = a[i];
        }
        a[i] = tmp;
        if(i+1 == num) {
            return a[i];
        } if(i+1 < num) {
            return findKMaxNum(a, i+1, end, num);
        } else {
            return findKMaxNum(a, start, i, num);
        }

    }
}

算法思想,借用快速排序的思想,完成数据的定位。这样在每次定位后,都可以忽略一部分数据,好比1+1/2+1/4+1/8 + …… < 2的。这样复杂度为O(2n),也就是O(n)了

问题2:寻找数组中的第K大的元素。
这里写图片描述

如题,数组给出的都为整数,那么哦我们可以在O(n)时间复杂度,O(1)空间复杂度内解决该问题。

public class FindDuplicateNum {

    static int A[] = new int[]{1,3,6,7,8,9,3,4,10,2};

    public static void main(String args[]) {

        for(int i=0;i< A.length;i++) {

            if(A[Math.abs(A[i])-1] < 0) {

                System.out.println(Math.abs(A[i]));
            }
            A[Math.abs(A[i])-1] = -A[Math.abs(A[i])-1];
        }
    }
}

该算法思想为,用原数组进行标记,遍历数组过程中,对当前值指向的数值取反。如果发现该数值已经为负数,则表明该数值已有数据指向,说明该数值对应的序号为重复数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值