问题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];
}
}
}
该算法思想为,用原数组进行标记,遍历数组过程中,对当前值指向的数值取反。如果发现该数值已经为负数,则表明该数值已有数据指向,说明该数值对应的序号为重复数值。