【问题标题】:Find the k smallest integer in an array查找数组中的 k 个最小整数
【发布时间】:2014-11-12 17:25:05
【问题描述】:

这是我的代码,它适用于查找 1-7 个最小整数,但 8 和 9。当我在数组中找到 8 个最小整数时,它返回 null。谁能帮我解决问题在哪里?我在这里使用快速排序。 非常感谢!

update:我已经找到问题所在了,就是main函数中的数组。我改成下面的样子后,

int[] arr = {2, 3, 1, 7, 5, 6, 20, 8, 4, 9};

if(front>=end) return input;

现在可以了!

import java.util.Arrays;
import java.io.*;

class quicksort{
public static void main(String[] args){
    int[] arr = new int[9];
    arr[0] = 7;
    arr[1] = 2;
    arr[2] = 4;
    arr[3] = 8;
    arr[4] = 3;
    arr[5] = 5;
    arr[6] = 1;
    arr[7] = 0;
    arr[8] = 10;

    System.out.println((Arrays.toString(findKSamllest(arr,8))));
}
public static int partition(int[] input, int front, int end){
    int pivot = input[front];
    while(front < end){
        while(input[front]<pivot)
            front++;
        while(input[end]>pivot)
            end--;
        swap(input,front,end);
    }
    return front;
}
public static void swap(int[] input, int s, int l){
    int temp = input[s];
    input[s] = input[l];
    input[l] = temp;
}

public static int[] findK(int[] input, int front, int end, int k){
    if(front>=end) return null;
    int pivot = partition(input,front,end);
    //System.out.println(pivot);
    if(k==pivot){
        return Arrays.copyOfRange(input,0,pivot);
    }
    else {
        if(k<pivot) 
            return findK(input,front,pivot,k); 
        return findK(input,pivot+1,end,k);
    }
}
public static int[] findKSamllest(int[] input, int k){
    return findK(input, 0, input.length-1, k);
}

}

【问题讨论】:

  • 你为什么不Arrays.sort()然后提取前7项?
  • 我打赌你可以让它在较小的测试用例上失败。
  • @fge 那将是次优的! :) 选择可以在 O(n) 中完成。
  • @GiovanniBotta 到底怎么样?当然,这可能是一些家庭作业,但为什么要重新发明轮子呢?
  • @fge Quickselect 并不是“重新发明轮子”。它轮子。

标签: java arrays algorithm


【解决方案1】:

改变

if(front >= end) return null;

if(front > end) return null;

【讨论】:

    【解决方案2】:

    站在巨人的肩膀上,使用已有的库:

    Arrays.sort(myArray);
    int[] returnArray = new int(NUM_ITEMS_TO_RETURN);
    for (int i=0; i < NUM_ITEMS_TO_RETURN; i++)
    {
       returnArray[i] = myArray[i];
    }
    
    return returnArray;
    

    显然您必须进行一些错误检查,例如初始数组是否大于或等于您要返回的项目数,但这很简单。

    【讨论】:

      【解决方案3】:

      您可以节省一点时间,并用花哨的新 Java 8 API 给您的老师留下深刻印象。

      它提供了流和有用的函数来解决这个问题,如果它应该可读的话,可以用一行(长)行或 5 行来解决;-)

      final List<Integer> sortedKList = Arrays.asList(7, 2, 4, 8, 3, 5, 1, 0, 10)
          .stream()
          .sorted()
          .limit(7)
          .collect(Collectors.toList());
      

      然后您可以通过以下方式查看您的结果:

      sortedKList.forEach(System.out::println);
      

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多