对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。
给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。
测试样例:
[1,2,4,3],4,2
返回:[1,2]
import java.util.*;
public class KthNumbers {
public int[] findKthNumbers(int[] A, int n, int k) {
// write code here
int[] arr = new int[k];
int m = GetK(A,k);
for(int i=0,j=0;i<n&&j<k;i++){
if(A[i]<=m){
arr[j] = A[i];
j++;
}
}
return arr;
}
public static int GetK(int[] A,int k){
int[] tmp = new int[A.length];
for(int i=0;i<A.length;i++){
tmp[i] = A[i];
}
Arrays.sort(tmp);
return tmp[k-1];
}
}
public class KthNumbers {
public static int[] findKthNumbers(int[] A, int n, int k) {
int count = n - k;
int length = A.length;
while (count > 0) {
int maxNumberIndex = 0;
int i;
for (i = 1; i < length; i++) {
if (A[maxNumberIndex] < A[i]) {
maxNumberIndex = i;
}
}
for (int j = maxNumberIndex; j < length - 1; j++) {
A[j] = A[j + 1];
}
length--;
count--;
}
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = A[i];
}
return result;
}
} public static int[] findKthNumbers(int[] A, int n, int k) {
int[] CA = new int[n];
System.arraycopy(A, 0, CA, 0, n);
Arrays.sort(CA);
int[] min = new int[k];
int index = 0;
int number = CA[k - 1];
for (int i = 0; i < n; i++) {
if (A[i] <= number) {
min[index] = A[i];
index++;
}
}
return min;
}
import java.util.*;
public class KthNumbers {
public int[] findKthNumbers(int[] A, int n, int k) {
int B[] = new int[A.length];
for (int i = 0; i < A.length; i++) {
B[i] = A[i];
}
java.util.Arrays.sort(A);
int kth = A[k-1];
int[] result = new int[k];
int index = 0;
for(int i=0; i< B.length; i++){
if( B[i] <= kth){
result[index] = B[i];
index++;
}
}
return result;
}
} 对于本题应首先明确一点:需要保留k个较小的元素,那也就意味着可以删除除n-k个较大的元素。
具体实现代码如下:
public class KthNumbers {
public static int[] findKthNumbers(int[] A, int n, int k) {
// write code here
int count=n-k;//要删除的元素数量
int LENGTH=A.length;//实际数组中的元素个数
while(count>0){
//删除当前数组中最大的元素
int max_index=0;//记录最大元素的下标
int i;
for(i=1;i<LENGTH;i++){//寻找最大元素并记录其在数组中的下标
if(A[max_index]<A[i]){
max_index=i;
}
}
//删除当前最大元素即max_index
for(int j=max_index;j<LENGTH-1;j++){
A[j]=A[j+1];
}
LENGTH--;//注意删除后数组的个数要减一
count--;
}//end while****************
int res[] = new int[LENGTH];//结果集数组
for(int i=0;i<LENGTH;i++){//当删除完元素后只需将保留下的k个元素赋值到结果数组中
res[i]=A[i];
}
return res;
}
}