有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

返回k个最小元素的java数组

从数组int[] a中,我想找到并返回一个k.length的数组,其中包含排序的k个最小元素

数组a的内容不能有任何更改。在创建一个k.length的帮助数组后,我从a复制k个first值,然后对其排序

在此之后,如果数组a中有任何元素小于帮助数组中的元素,我将其放置在正确的位置,最后一个元素消失,依此类推

方法:

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;
}

共 (6) 个答案

  1. # 1 楼答案

    我会使用一个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]);
    }
    
  2. # 2 楼答案

    我想下面的代码符合你的目的

    公共类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. # 3 楼答案

    下面是一个在包含唯一元素的数组中查找K个最小元素的实现。如果希望允许重复,可以使用java。util。设置以消除重复项。 它基于随机快速选择算法,最坏情况的顺序为n。它输出原始数组中K个最小元素的无序序列

    首先,它找到第k个最小元素的索引,并对列表[k]进行部分无序排序。因此,最终结果将包含K个数字,这些数字在数组中较小,第K个最小元素位于最右边的位置

     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;
        }
    }
    
  4. # 4 楼答案

    我会用英语写,但如果你想用挪威语解释,我也可以。我不会为您编写任何代码存根,因为这是一个家庭作业,但请尝试想象您首先需要完成什么: 我猜数组a是未排序的,或者至少是按文本中显示的相反方式排序的? 一个不能改变的目标。 k、 长度为k时,应包含a中最小值数的k个数量。 k必须排序

    首先也是最重要的,你如何解决问题1?我会做什么(一开始效率更低,但您不必编写那么多代码): 检查数组a,首先将索引0中的第一个整数保存到k中。让i++发挥它的魔力,然后调用一个方法,在其中发送整个数组k和新整数。让它检查(使用compareTo()-method)新的int是否低于k中每个索引中的整数,将其他数字一直向前移动一个索引(记住要检查null值,或者lse:NPE)。返回此新数组。 这将允许您保存k个最低的数字,对它们进行排序,而不更改a。我认为这将解决您的整个问题

  5. # 5 楼答案

    您可以对数组进行排序,并从中获取前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;
    }
    

    希望有帮助:)

  6. # 6 楼答案

    您可以从原始数据构建一个堆,该堆将是O(nlogn),然后从该堆中获取k个元素,在最坏的情况下,该堆也将是O(nlogn)