从数组int[] a
,我想找到并返回一个k.length包含k个最小元素的数组。
无法更改数组a的内容。在创建k.length的帮助数组后,我从a复制k个第一个值,然后对其进行排序。
在此之后,如果数组中的任何元素小于帮助数组中的元素,则将其放在正确的位置,最后一个元素消失,依此类推。
方法:
public static int[] kMinst(int[] a, int k)
可能的输入:
int[] a = {1,2,3,4,5,6,7,8,9,10}
kMinst(a, a.length);
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
另一个输入:
int[] b = {4,3,2,1}
kMinst(b, 3);
输出:
[1, 2, 3]
到目前为止我有什么。并且它不起作用并且效率太低:
public static int[] kMinst(int[] a, int k) {
if (k < 1 || k > a.length) {
throw new IllegalArgumentException("k har ikke riktig verdi!");
}
int[] verdier = new int[k];
for (int i = 0; i < verdier.length; i++) {
verdier[i] = a[i];
}
sortering(verdier);
for (int i = verdier.length; i < a.length; i++) {
for (int j = verdier.length - 1; j > 0; j --) {
if (a[i] < a[j]) {
int temp = a[j];
for (int l = verdier.length - 1; l > j; l--) {
a[l] = a[l - 1];
}
a[j] = temp;
}
}
}
return verdier;
}
答案 0 :(得分:0)
您可以从原始数据构建一个堆,该堆将是O(nlogn),然后从该堆获取k个元素,在最坏的情况下也是O(nlogn)。
答案 1 :(得分:0)
您可以对数组进行排序,并从中获取前k个元素。
public static int[] kMinst(int[] a, int k){
if (k < 1 || k > a.length) {
throw new IllegalArgumentException("k need to be greater than 1 and lesser than the length of the array");
}
int help[] = new int[a.length];
int res[] = new int[k];
for(int i = 0; i < a.length; i++) help[i] = a[i]; // copy the a array, not to change it
Arrays.sort(help);
for(int i = 0; i < k; i++) res[i] = help[i]; // get the first k elements from the sorted array
return res;
}
希望有所帮助:)
答案 2 :(得分:0)
我猜以下代码可以满足您的目的,
public class SortArray {
public int[] sort(int[] a,int b) {
int c[]=new int[b];
int temp=0;
for (int i = 1; i < a.length; i++) {
for (int j = 0; j < i; j++) {
if(a[i] <=a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for (int i = 0; i < b; i++) {
c[i]=a[i];
}
return c;
}
public static void main(String[] args) {
int a[]={7,2,4,5,3,7};
SortArray sort=new SortArray();
int[] c=sort.sort(a,3);
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
}
答案 3 :(得分:0)
我使用Set
来丢弃重复项并将其设为TreeSet
,因此它会自行完成所有排序。
public static Integer[] kSmallest(Integer[] a, int k) {
// Use a TreeSet to keep tbhe smallest.
TreeSet<Integer> kSmallest = new TreeSet<Integer>();
// Fold all the array into the set.
for (Integer x : a) {
// Add it in.
kSmallest.add(x);
// Trim to k.
if (kSmallest.size() > k) {
Iterator<Integer> last = kSmallest.descendingIterator();
// Select the biggest.
last.next();
// Remove it.
last.remove();
}
}
// Make my result.
return kSmallest.toArray(new Integer[0]);
}
答案 4 :(得分:0)
这是一个实现,它在包含唯一元素的数组中找到 K 个最小元素。如果要允许重复项,可以使用 java.util.Set 来消除重复项。 它基于随机快速选择算法,并且具有 n 的最差情况。它从原始数组输出 K 个最小元素的无序序列。
首先,它找到Kth最小元素的索引以及相对于list [k]的部分无序排序。因此,最后的结果将包含 K 数字,这些数字在数组中较小,而Kth最小元素位于最右侧位置。
public class QuickSelect {
public static void main (String[] args) {
final int[] list = new int[]{1,2,11,16,34,3,4,42,5,6,28,7,8,9,10};
QuickSelect qs = new QuickSelect();
final int k = 10;
final int kthMinIndex = qs.findKthMinimum (list, k - 1);
System.out.println("[");
for (int i = 0; i <= kthMinIndex; i++)
System.out.print(list[i] + " ");
System.out.print("]");
}
public int findKthMinimum (final int[] list, final int k) {
if (k > list.length || k < 1) {
throw new IllegalArgumentException("Bad arguments.");
}
final int left = 0;
final int right = list.length - 1;
final int pivot = (int)Math.floor((double)left + (Math.random() * (double)(right - left)));
final int result = findKthMinimum (list, left, right, k , pivot);
return result;
}
private int findKthMinimum (final int[] list, int left, int right, final int k, int pivot) {
int partitionElement = partition (list, left, right, pivot);
while (left != right) {
if (partitionElement == k)
break;
else if (partitionElement > k) {
right = partitionElement - 1;
pivot = (int)Math.floor((double)left + (Math.random() * (double)(right - left)));
} else if (partitionElement < k) {
left = partitionElement + 1;
pivot = (int)Math.floor((double)left + (Math.random() * (double)(right - left)));
}
partitionElement = partition (list, left, right, pivot);
}
return list[partitionElement];
}
private int partition (final int[] list, int left, int right, int pivot) {
final int pivotElement = list[pivot];
swap (list, pivot, right);
int lastStoredIndex = left;
for (int i = left; i < right; i++) {
if (list[i] < pivotElement) {
swap (list, i, lastStoredIndex++);
}
}
swap (list, lastStoredIndex, right);
return lastStoredIndex;
}
private void swap (final int[] list, final int first, final int second) {
final int temp = list[first];
list[first] = list[second];
list[second] = temp;
}
}
答案 5 :(得分:0)
我会用英文写这个,但如果你想用挪威语解释,我也可以这样做。我不会给你写任何代码存根,因为这是一个功课,但试着想象你需要先做什么: 我猜数组a是未排序的,或者至少排序但是反向排列,如文中所示? 一个不能改变。 k长度的k应该包含a中k个最低值的数量。 k必须排序。
首先,您如何解决问题1?我会做什么(这在开始时效率较低,但你不必编写尽可能多的代码): 遍历数组a,首先将索引0中的第一个整数保存在k中。让i ++运行它的魔力,然后调用一个方法,你发送整个数组k和新的整数。让它检查(使用compareTo() - 方法)新的int是否低于k中每个索引中的整数,将其他数字一直向前移动一个索引(记得检查空值,orelse:NPE )。返回这个新数组。 这将允许您保存k个最低数字,对它们进行排序而不是更改a。我认为这会解决你的整个问题?